AWK ----ÊÇÒ»ÖÖÓÃÓÚ´¦ÀíÎı¾µÄ±à³ÌÓïÑÔ¹¤¾ß¡£
Ó¢ÎÄÔÒ壺Aho¡¢Weinberger¡¢Kernighan
ÖÐÎÄÊÍÒ壺Èýλ´´ÔìÕßAho¡¢WeinbergerºÍKernighanͳ³Æ
AWK ÔÚºÜ¶à·½ÃæÀàËÆÓÚ shell ±à³ÌÓïÑÔ£¬¾¡¹Ü AWK ¾ßÓÐÍêÈ«ÊôÓÚÆä±¾ÉíµÄÓï·¨¡£×î³õ´´Ôì AWK ʱ£¬ÆäÄ¿µÄÊÇÓÃÓÚÎı¾´¦Àí£¬²¢ÇÒÕâÖÖÓïÑԵĻù´¡ÊÇ£¬Ö»ÒªÔÚÊäÈëÊý¾ÝÖÐÓÐģʽƥÅ䣬¾ÍÖ´ÐÐһϵÁÐÖ¸Áî¡£¸ÃʵÓù¤¾ßɨÃèÎļþÖеÄÿһÐУ¬²éÕÒÓëÃüÁîÐÐÖÐËù¸ø¶¨ÄÚÈÝÏàÆ¥ÅäµÄģʽ¡£Èç¹û·¢ÏÖÆ¥ÅäÄÚÈÝ£¬Ôò½øÐÐÏÂÒ»¸ö±à³Ì²½Öè¡£Èç¹ûÕÒ²»µ½Æ¥ÅäÄÚÈÝ£¬Ôò¼ÌÐø´¦ÀíÏÂÒ»ÐС£
awk Ö®ËùÒÔ³ÉΪһÖÖÓÅÐãµÄ³ÌÐòÉè¼ÆÓïÑÔµÄÔÒòÖ®Ò»ÊÇÄÚÖú¯ÊýµÄʹÓã¬awk¶¨Òå²¢Ö§³ÖÁËһϵÁеÄÄÚÖú¯Êý£¬ÓÉÓÚÕâЩº¯ÊýµÄʹÓã¬Ê¹µÃawkÌṩµÄ¹¦ÄܸüΪÍêÉÆºÍÇ¿´ó¡£
³£ÓÃÓï·¨£º
awk [options] 'commands' testfiles
optionsÑ¡Ïî
-F ¶¨Òå×ֶηָô·û£¬Ä¬ÈÏ·Ö¸ô·ûΪÁ¬Ðø¿Õ¸ñ»òÖÆ±í·û
ÓÃ$1,$2,$3µÈ˳Ðò±íʾfilesÖÐÿÐÐÒÔ¼ä¸ô·ûºÅ·Ö¸ôµÄ¸÷Áв»Í¬Óò
-v ¶¨Òå±ä¸ü²¢¸³Öµ£¬Ò²¿ÉÒÔ½èÓôη½Ê½´Óshell±äÁ¿ÖÐÒýÈë±äÁ¿
ʹÓÃʾÀý£º
[root@localhost test]# awk -F":" '{print $1,$7}' testfile
ÒÔðºÅ×÷Ϊ·Ö¸ô·û£¬´òÓ¡µÚ1ºÍµÚ7¸ö×Ö¶Î
[root@localhost test]# awk -F"[:/]" '{print $1,$7}' testfile
ÒÔðºÅ»òб¸Ü / ×÷Ϊ·Ö¸ô·û£¬´òÓ¡µÚ1µÚ7¸ö×Ö¶Î
[root@localhost test]# awk -F":/" '{print $1,$7}' testfile
ÒÔðºÅ¼Óб¸Ü ¡°£º/¡±ÕûÌå×÷Ϊ·Ö¸ô·û
-----------------------------------------------------------
command
¶Áǰ´¦Àí Ðд¦Àí ¶Áºó´¦Àí
1¡¢¶Áǰ´¦Àí BEGIN{awk_cmd1;awk_cmd2;}
2¡¢Ðд¦Àí£º¶¨Ö· ÃüÁî
¶¨Ö··½·¨£ºÕýÔò£¬±äÁ¿£¬±È½Ï£¬¹ØÏµÔËËã
ÕýÔòÐèÒªÓà / / °ü¹üÆðÀ´
³£ÓÃÕýÔò£º
^ ÐÐÊ× $ ÐÐβ
. ³ýÁË»»ÐзûÒÔÍâµÄÈÎÒâµ¥¸ö×Ö·û
* ǰµ¼×Ö·ûµÄÁã¸ö»ò¶à¸ö
.* ËùÓÐ×Ö·û
[] ×Ö·û×éÄÚµÄÈÎÒ»×Ö·û
[^] ¶Ô×Ö·û×éÄÚµÄÿ¸ö×Ö·ûÈ¡·´(²»Æ¥Åä×Ö·û×éÄÚµÄÿ¸ö×Ö·û)
^[^] ·Ç×Ö·û×éÄÚµÄ×Ö·û¿ªÍ·µÄÐÐ
[a-z] Сд×Öĸ
[A-Z] ´óд×Öĸ
[a-Z] СдºÍ´óд×Öĸ
[0-9] Êý×Ö
\< µ¥´ÊÍ·,ÒÔ¿Õ¸ñ»òÌØÊâ×Ö·û×ö·Ö¸ô,Á¬ÐøµÄ×Ö·û´®±»µ±×öµ¥´Ê
\> µ¥´Êβ
À©Õ¹ÕýÔò
? ǰµ¼×Ö·ûÁã¸ö»òÒ»¸ö
+ ǰµ¼×Ö·ûÒ»¸ö»ò¶à¸ö
abc|def abc»òdef
a(bc|de)f abcf »ò adef
x\{m\} x³öÏÖm´Î
x\{m,\} x³öÏÖm´ÎÖÁ¶à´Î(ÖÁÉÙm´Î)
x\{m,n\} x³öÏÖm´ÎÖÁn´Î
NR±äÁ¿¶¨Ö·£¬NR ±íʾAWK¶ÁÈëµÄÐÐÊý
FNR±íʾ¶ÁÈëÐÐËùÔÚÎļþÖеÄÐÐÊý
Âß¼ÔËËã----¿ÉÖ±½ÓÒýÓÃÓò½øÐÐÔËËã
== >= <= != > < ~ !~
È磺# awk 'NR==1 {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
ÃüÁî È磺{print $1,$2}
3¡¢¶Áºó´¦Àí
END {awk_cmd1;awk_cmd2;}
---------------------------------------------------------------
AWkµÄ±äÁ¿
NR AWK´¦ÀíµÄ×ÜÐÐÊý
FNR AWK´¦ÀíµÄµ±Ç°ÎļþµÄÐÐÊý,·ÇÈ«²¿
FS ×ֶηָô·û,ĬÈÏΪÁ¬Ðø¿Õ¸ñ»òÖÆ±í·û,¿ÉÒÔʹÓöà¸ö²»Í¬µÄ·ûºÅ×ö·Ö¸ô·û,Ò²¿ÉÔÚoptions³öʹÓà -F[:/] Ö¸¶¨·Ö¸ô·û
OFS Êä³ö×Ö·ûµÄ·Ö¸ô·û ĬÈÏÊǿոñ
È磺# awk -F: 'OFS="***" {print $1,$2}' /etc/passwd
root***x
NF µ±Ç°¶ÁÈëÐеÄ×ֶθöÊý
ORS Êä³öÐеķָô·û,ĬÈÏÊÇ»»ÐÐ
# awk -F: 'ORS="***" {print $1,$2}' /etc/passwd
root x***bin x***
FILENAME µ±Ç°ÎļþÃû
ÒýÓÃshell±äÁ¿µÄ·½·¨£º
£¨1£©Ê¹Óà -v ÒýÓñäÁ¿Öµ
[root@localhost test]# a=5
[root@localhost test]# awk -v c=$a -F: 'NR < c {print NR,$0}' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
£¨2£©°ÑÕû¸öÃüÁî²ð¿ª´«µÝ£¬ÈÃshell±äÁ¿Íâ¶
[root@localhost test]# a=5
[root@localhost test]# awk -F: 'NR < '$a'{print NR,$0}' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
------------------------------------------------------------
²Ù×÷·û
¸³Öµ = += -= /= *=
&& ----Âß¼Óë ||----Âß¼»ò !----Âß¼·Ç
Æ¥ÅäÕýÔò»ò²»Æ¥Åä,ÕýÔòÐèÒªÓà /ÕýÔò/ °üΧס
~ !~
¹ØÏµ ±È½Ï×Ö·û´®,Òª°Ñ×Ö·û´®ÓÃË«ÒýºÅÒýÆðÀ´
< <= > >= != ==
×Ö¶ÎÒýÓÃ
$ ×Ö¶ÎÒýÓÃÐèÒª¼Ó$ ¶ø±äÁ¿ÒýÓÃÖ±½ÓÓñäÁ¿ÃûÈ¡
ÔËËã·û
+ - * / % ++ --
תÒåÐòÁÐ
\\ \×ÔÉí
\$ תÒå$
\t ÖÆ±í·û
\b Í˸ñ·û
\r »Ø³µ·û
\n »»Ðзû
\c È¡Ïû»»ÐÐ
Ó÷¨Ê¾Àý£º
# awk -F: '$3 >= 30 && $3 <= 40 {print $0}' /etc/passwd
´òÓ¡³öuidÔÚ30µ½40Ö®¼äµÄÓû§ÐÅÏ¢ÐÐ
# awk -F: ' NR >= 30 && NR <= 40 {print NR,$0}' /etc/passwd
´òÓ¡³öÐкÅÔÚ30µ½40Ö®¼äµÄÐÐ
# awk -F: ' NR % 2 == 1 {print NR,$1,NF}' /etc/passwd
´òÓ¡ÆæÊýÐÐ
# awk -F: ' NR % 2 == 0 {print NR,$1,NF}' /etc/passwd
´òӡżÊýÐÐ
# awk -F: ' $3 != $4 {print NR,$1,$3,$4}' /etc/passwd
´òÓ¡uidºÍgid²»ÏàµÈµÄÓû§ÐÅÏ¢ÐÐ
# awk -F: '$7 ~ /bash/ {print NR,$1,$7}' /etc/passwd
´òÓ¡µÚ7¸ö×Ö¶ÎÄÜÆ¥Åä /bash/ ×Ö·û´®µÄÐÐ
# awk -F: '$7 !~ /nologin/ {print NR,$1,$7}' /etc/passwd
´òÓ¡µÚ7¸ö×ֶβ»ÄÜÆ¥Åä /nologin/ ×Ö·û´®µÄÐÐ
------------------------
Êý×é
×Ô¶¨ÒåÊý×é
# awk 'BEGIN{ary[1]="hunan";ary[2]="hubei";print ary[1],ary[2]}'
hunan hubei
# awk 'BEGIN{ary[1]="hunan";ary[2]="hubei";for(i in ary) print ary[i]}'
hunan
hubei
»·²úÉúÊý×éºÍÈ¡³öÊý×é
# awk 'BEGIN{n=5;for (i=1;i<=n;i++) ary[i]=i+100;for(m in ary) print m,ary[m]}'
4 104
5 105
1 101
2 102
3 103
# awk -F: '{ary[NR]=$1}END{for(i in ary){print i,ary[i]}}' testfile
4 dbus
5 usbmuxd
6 hsqldb
7 avahi-autoipd
8 rpc
1 root
2 bin
3 myuser
# awk -F: '{ary[$3]=$1} END {for(i in ary) print i,ary[i]}' testfil
Á÷³Ì¿ØÖÆ
·ÖÖ§½á¹¹
(Ò») if (Ìõ¼þ) ¶¯×÷
if (Ìõ¼þ) {¶¯×÷1;¶¯×÷2}
È磺
# awk -F: '{if ($1 == "root")print $1}' /etc/passwd
awk -F: '{if ($1 == "root"){print $1;print $7}}' /etc/passwd
£¨¶þ£© if (Ìõ¼þ1)
¶¯×÷1
else
¶¯×÷2
È磺
# awk -F: '{if ($1 == "root") print $1; else print $6}' testfile
# awk -F: '{if ($1 == "root") {print $1} else print $6}' testfile
ÉÏÃæÁ½¸öÃüÁîÊǵȼ۵Ä,ҪôÓ÷ֺŸô¿ª,±íʾµÚÒ»¸ö¶¯×÷ÌåµÄ½áÊø,Ҫô½«¶¯×÷ÌåÓôóÀ¨ºÅ¶¨Î»·¶Î§
£¨Èý£©if (Ìõ¼þ1)
¶¯×÷1
else if (Ìõ¼þ2)
¶¯×÷2
else if (Ìõ¼þ2)
¶¯×÷3
else
¶¯×÷4
È磺
# awk -F: '{if ($1=="root")print $1;else if($1=="bin")print $3;else if($1=="myuser")print $7}' testfile
£¨ËÄ£© Ìõ¼þ ? ¶¯×÷1£º¶¯×÷2
expr ? action1:action2
È磺
# awk -F: 'AA=($3>=500?$3:"system_user"){print $1"\t"$3"\t"AA}' testfile
root 0 system_user
bin 1 system_user
myuser 501 501
----------------------------------------------------------
¶Áǰ´¦ÀíºÍ¶Áºó´¦Àí
È磺
# awk 'BEGIN{i=1} {i++} END{print i}' /etc/passwd
# awk -F: 'BEGIN{print NR,NF} END{print NR,NF}' /etc/passwd
0 0
46 7
# awk -F: 'BEGIN{sum=0} {sum=sum+NF}END{print sum}' /etc/passwd
322
# awk -F: 'BEGIN{sum=0} {sum+=NF}END{print sum}' /etc/passwd
322
BEGIN¿é¿ÉÒÔ¶ÀÁ¢Ê¹ÓÃ,²»ÐèÒªÒýÈëÎļþ
# awk 'BEGIN{i=1;while(i<10) {print i;i++}}'
1
2
3
4
5
6
7
8
9
-------------------------------------------------------------
Ñ»·Óï¾ä
£¨Ò»£© while (Ìõ¼þ)
{
¶¯×÷
Ìõ¼þÔËËã
}
È磺
# awk -F: '{while($3<3) {print $3,$1;$3++}}' /etc/passwd
0 root
1 root
2 root
1 bin
2 bin
2 daemon
(¶þ) do {
¶¯×÷
Ìõ¼þÔËËã
} while (Ìõ¼þ)
È磺
# awk 'BEGIN{i=5;do{print i;i++}while(i<10)}'
5
6
7
8
9
(Èý)for (Ô¤ÖÃ;Ìõ¼þ;µÝÔö) {
¶¯×÷
}
È磺
# awk 'BEGIN{for (i=1;i<5;i++) print i}'
1
2
3
4
(ËÄ) Ñ»·forǶÌ×
È磺
# awk 'BEGIN{for (i=1;i<3;i++) {for (j=1;j<=3;j++) print i,j}}'
1 1
1 2
1 3
2 1
2 2
2 3
# awk 'BEGIN{OFS="";for (i=1;i<=9;i++) {for (j=0;j<=9;j++) {for (n=0;n<=9;n++) print i,j,n}}}' ʹÓÃǶÌ×µÄforÑ»·,´òÓ¡100-999Ö®¼äµÄÊý
# awk -F: '{for(x=NF;x>0;x--)print $x}' testfile ÄæÐòÊä³ö
------------------------------------------------------------
Êä³öÑùʽ
# awk -F: '{printf "%-10s %-7d %s\n",$1,$3,$7}' testfile
root 0 /bin/bash
bin 1 /sbin/nologin
myuser 501 /bin/bash
ÃüÁî·ÖÎö£º
%sÊÇ×Ö·ûÀàÐÍ,%dÊýÖµÀàÐÍ
printfĬÈÏÊDz»Êä³ö»»ÐеÄËùÒÔÒª¼Ó\n£¨printfºÍprint²»Í¬£¬printĬÈÏÿÊä³öÒ»ÐнøÐл»ÐУ©
10ºÍ7ÊÇÆ«ÒÆÁ¿
ĬÈÏÊÇÓÒ¶ÔÆë,ËùÓмӸö- ¾ÍÊÇ×ó¶ÔÆë,¾ÍÊǰѲ»×ãµÄλÊýÓÿոñÌî³ä
×¢Òâ:¸ñʽÓëÊä³öÁÐÖ®¼äÒªÓжººÅ
Ìø×ªÓï¾ä
break Ìø³öÑ»·
# awk 'BEGIN {for(x=1;x<5;x++) {if (x==3) break;print x }}'
1
2
continue Ôڴﵽѻ·µ×²¿Ö®Ç°ÖÕÖ¹µ±Ç°Ñ»· ´ÓпªÊ¼ÏÂÒ»´ÎÑ»·
# awk 'BEGIN {for(x=1;x<5;x++) {if (x==3) continue;print x }}'
1
2
4
next ¶ÁÈëÏÂÒ»ÐРͬʱ·µ»Ø½Å±¾¶¥²¿ ÕâÑù¿ÉÒÔ±ÜÃâ¶Ôµ±Ç°ÐÐÖ´ÐÐÆäËû²Ù×÷
# awk -F: 'NR > 5 {next} {print $1} END {print NR}' /etc/passwd
root
bin
daemon
adm
lp
46
exit ʹ¶ÁÈ¡¶¯×÷ÖÕÖ¹ ²¢½«¿ØÖÆÒƶ¯µ½END,Èç¹ûûÓÐENDÔòÖÕÖ¹½Å±¾
# awk -F: 'NR > 5 {exit} {print $1} END {print NR}' /etc/passwd
root
bin
daemon
adm
lp
6
--------------------------------------------------------------------
º¯Êý
ת»»º¯Êý£¬×ª»»³ÉÕûÊý
È磺
# awk 'BEGIN{print int(3.934)}'
3
Ëæ»úÊýº¯Êý rand() srand()
rand() ȡֵ 0 > r > 1 Ö®¼ä ĬÈϵÄÖÖ×ÓÊÇϵͳʱ¼ä ¾«È·µ½Ãë
srand()ȡֵ 0 > r > 1 Ö®¼ä ¿ÉÒÔÖ¸¶¨ÖÖ×ÓÀ´Ó°Ïìrand()ȡֵÊý ĬÈÏÊÇϵͳʱ¼ä ¾«È·µ½Ãë
echo $RANDOM
È磺
# awk 'BEGIN{print int(rand()*100)}'
23
# awk 'BEGIN{srand(123);print int(rand()*100)}'
74
# awk -v a=$RANDOM 'BEGIN{print a}'
22059
×Ö·û´®º¯Êý
substr(s,x,y)
·µ»Ø×Ö·û´®sÖдÓλÖÃxÆðÖÁyµÄ×Ó´®,Èç¹ûûÓиø³öy,Ôò´Óx¿ªÊ¼µ½½áÊø
È磺
# awk 'BEGIN{aa="abcdefghi";print substr(aa,3,4)}'
cdef
# awk 'BEGIN{aa="abcdefghi";print substr(aa,1)}'
abcdefghi
´óдСдº¯Êý
tolower() Сдº¯Êý
toupper() ´óдº¯Êý
sprintf() ±¾Éí²¢²»ÄÜ´òÓ¡,×ö¸ñʽת»»,½«Êý×Öת»»³ÉASCII×Ö·û
# awk 'BEGIN{for(i=97;i<=122;++i)print toupper(sprintf("%c",i))}'
# awk 'BEGIN{for(i=97;i<=122;++i)print tolower(sprintf("%c",i))}'
×Ö·û´®³¤¶È
length() Èç¹ûûÓиø¶¨×Ö·û´®ÔòʹÓÃ$0
# awk 'BEGIN{print length("abcdefghi")}'
9
# awk '{print length()}' /etc/passwd
gsub(/abc/,"ABC",x)
È«¾Ö×Ö·û´®Ìæ»»£¬´ÓxÖÐÓÃÆ¥ÅäµÄabcÕýÔòÌæ»»³ÉABC
# awk 'BEGIN{aa="abcxyzabcxyzabc";gsub(/abc/,"ABC",aa);print aa}'
ABCxyzABCxyzABC
ϵͳ½»»¥ÊäÈ뺯Êý----getline
£¨µÈͬÓÚshellÖеÄread -p "strings" var £©
È磺
# awk -F: 'BEGIN{printf "sss: ";getline;for(i=1;i<=$0;i++) print i}'
sss: 4
1
2
3
4
ʹÓÃgetlineº¯Êý½«ÊäÈëÖµ¸³¸ø±äÁ¿
# awk -F: 'BEGIN{printf "haoren: ";getline NUM;for(i=1;i<=NUM;i++)print NUM,i}'
haoren: 5
5 1
5 2
5 3
5 4
5 5
´ÓÎļþÖжÁÈë
#awk -F: 'BEGIN {while (getline < "/etc/passwd" > 0) print $3"\t"$1}'
getline < "/etc/passwd" ´ÓÎļþÖжÁÈë,ÿ´Î¶ÁȡһÐÐ,ĬÈÏÇé¿ö϶ÁÈ¡µÄ´ÎÊýµÈÓÚawk×ÔÉíÒýÈëÎļþµÄÐÐÊý
> 0 ²âÊÔ¶ÁÈ¡µÄ·µ»ØÖµ,³É¹¦·µ»Ø1,ʧ°Ü·µ»Ø-1,0Îļþĩβ
´ÓÃüÁîÊä³öÖÐÊäÈë
[root@stu254 ~]# awk 'BEGIN {"uname -a"|getline ;print $3}'
2.6.18-53.el5
system(command)----ÒýÈëϵͳÃüÁϵͳÃüÁîÒªÓÃ""ÒýÆðÀ´
È磺
# awk 'BEGIN{if(system("mkdir mulu1") != 0) print "error"}'
# awk 'BEGIN{if(system("mkdir mulu1") != 0) print "error"}'
mkdir: ÎÞ·¨´´½¨Ä¿Â¼"mulu1": ÎļþÒÑ´æÔÚ
error
awk½Å±¾---- -f
½Å±¾¿ªÍ·Ê¹Óà #!/bin/awk -f
È磺ʹÓÃawk½Å±¾Ìí¼ÓÓû§
#!/bin/awk -f
{
system("useradd "$1";echo "$2"|passwd --stdin" $1)
}
# cat user.txt
myuser222 123123
myuser333 456456
# ./useradd.awk user.txt
¸ü¸ÄÓû§ myuser222 µÄÃÜÂë ¡£
passwd£º ËùÓеÄÉí·ÝÑéÖ¤ÁîÅÆÒѾ³É¹¦¸üС£
¸ü¸ÄÓû§ myuser333 µÄÃÜÂë ¡£
passwd£º ËùÓеÄÉí·ÝÑéÖ¤ÁîÅÆÒѾ³É¹¦¸üС£
À´Ô´£ºLinuxÉçÇø