awk¼ò½é
awk: ÖÐÎÄÒâ˼ÊDZ¨¸æÉú³ÉÆ÷ Äܹ»¸ù¾ÝÎÒÃÇÊäÈëµÄÐÅÏ¢£¬½«ÐÅÏ¢¸ñʽ»¯ÒÔºóÏÔʾ£¬½«¶¨ÒåºÃµÄÐÅÏ¢ÒԱȽÏÃÀ¹Û£¨Ö±¹Û£©µÄ·½Ê½ÏÔʾ³öÀ´³öÏֱȽÏÔ磬¼Ì¶ø³öÏÖÁËnew awk£¨nawk£©ÔÚwindowsÉÏʵÏÖ£¬gawk, awkʵÏÖÔÚlinuxÉÏ¡£awkÊÇÒ»ÖÖ±à³ÌÓïÑÔ£¬ÓÃÓÚÔÚlinux/unix϶ÔÎı¾ºÍÊý¾Ý½øÐд¦Àí¡£Êý¾Ý¿ÉÒÔÀ´×Ô±ê×¼ÊäÈë¡¢Ò»¸ö»ò¶à¸öÎļþ£¬»òÆäËüÃüÁîµÄÊä³ö¡£ËüÖ§³ÖÓû§×Ô¶¨Ò庯ÊýºÍ¶¯Ì¬ÕýÔò±í´ïʽµÈÏȽø¹¦ÄÜ£¬ÊÇlinux/unixϵÄÒ»¸öÇ¿´ó±à³Ì¹¤¾ß¡£ËüÔÚÃüÁîÐÐÖÐʹÓ㬵«¸ü¶àÊÇ×÷Ϊ½Å±¾À´Ê¹Óá£awkµÄ´¦ÀíÎı¾ºÍÊý¾ÝµÄ·½Ê½ÊÇÕâÑùµÄ£¬ËüÖðÐÐɨÃèÎļþ£¬´ÓµÚÒ»Ðе½×îºóÒ»ÐУ¬Ñ°ÕÒÆ¥ÅäµÄÌØ¶¨Ä£Ê½µÄÐУ¬²¢ÔÚÕâЩÐÐÉϽøÐÐÄãÏëÒªµÄ²Ù×÷¡£Èç¹ûûÓÐÖ¸¶¨´¦Àí¶¯×÷£¬Ôò°ÑÆ¥ÅäµÄÐÐÏÔʾµ½±ê×¼Êä³ö(ÆÁÄ»)£¬Èç¹ûûÓÐÖ¸¶¨Ä£Ê½£¬ÔòËùÓб»²Ù×÷ËùÖ¸¶¨µÄÐж¼±»´¦Àí¡£awk·Ö±ð´ú±íÆä×÷ÕßÐÕÊϵĵÚÒ»¸ö×Öĸ£¬·Ö±ðÊÇAlfred Aho¡¢Brian Kernighan¡¢Peter Weinberger¡£gawkÊÇawkµÄGNU°æ±¾£¬ËüÌṩ
ÁËBellʵÑéÊÒºÍGNUµÄһЩÀ©Õ¹¡£ÏÂÃæ¾Í¶Ôawk½øÐнéÉÜ¡£
awkʹÓõĻù±¾¸ñʽ£º
# awk [options] 'script' file1 file2, ...
# awk [options] 'PATTERN { action }' file1 file2, ...ϸ»¯ÁËÉÏÃæµÄ×éºÏ
³£ÓõÄÃüÁprint£¨Êä³ö£©, printf£¨´òÓ¡£©
awk¹¤×÷¹ý³Ì
¸ù¾ÝÎÒÃÇËù¶¨ÒåµÄģʽ£¬Ò»´Î´ÓÎļþÖжÁȡһÐÐÎı¾£¬awk»á¶ÔÈ¡³öµÄÎı¾×öÏàÓ¦µÄÇÐÆ¬£¬½«Ã¿Ò»Ðа´ÕÕ·Ö¸ô·û½øÐÐÇи¼ÙÈçÎÒÃÇÓÐÒ»ÐÐÎı¾£º this is a test.Ëü»áʹÓÿհ××Ö·ûµ±×ö·Ö¸ô·û£¬½«ËüÃǸ÷¸ö·Ö¿ª£¬Çиî³ÉÁËËĸöƬ£¬·Ö±ðΪ£º this is a test.ÕâËĸöƬ£¬¿ÉÒÔʹÓñäÁ¿£¬·Ö±ð¶ÔӦΪ$1,$2,$3,$4´ú±íËĸöÇÐ¸îÆ¬£¬ÏÂÃæ¾Í×öÒ»¸öÑÝʾ£¬¿´ÈçºÎʵÏÖawkµÄÇ¿´ó¹¦ÄÜ
Ò»¡¢awkµÄÊä³ö£ºprint
printµÄʹÓøñʽ£º
print item1, item2, ...
Êä³öÒªµã£º
1¡¢¸÷ÏîĿ֮¼äʹÓöººÅ¸ô¿ª£¬¶øÊä³öʱÔòÒÔ¿Õ°××Ö·û·Ö¸ô£»
2¡¢Êä³öµÄitem¿ÉÒÔΪ×Ö·û´®»òÊýÖµ¡¢µ±Ç°¼Ç¼µÄ×Ö¶Î(Èç$1)¡¢±äÁ¿»òawkµÄ±í´ïʽ£»ÊýÖµ»áÏÈת»»Îª×Ö·û´®£¬¶øºóÔÙÊä³ö£»
3¡¢printÃüÁîºóÃæµÄitem¿ÉÒÔÊ¡ÂÔ£¬´ËʱÆä¹¦ÄÜÏ൱ÓÚprint $0, Òò´Ë£¬Èç¹ûÏëÊä³ö¿Õ°×ÐУ¬ÔòÐèҪʹÓÃprint ""£»
ʵÀý·ÖÎö£º
ÏÔʾÕû¸öÎı¾£¨×¢Ò⣬ÕâÀïÖ»ÊDzâÊÔ£¬ËùÒÔÖ»ÓÐÒ»ÐУ©
# awk '{print $N}' test.txt
this is a test.
# awk '{print $0}' test.txt
this is a test.
ÏÔʾÎı¾µÄÒ»ÐÐÖеĵÚÒ»¸ö²ÎÊý
# awk '{print $1}' test.txt
this
ÏÔʾÎı¾µÄÒ»ÐÐÖеĵڶþ¸ö²ÎÊý
# awk '{print $2}' test.txt
is
ÏÔʾÎı¾µÄÒ»ÐÐÖеĵÚËĸö²ÎÊý
# awk '{print $4}' test.txt
test.
ÏÔʾÎı¾µÄÒ»ÐÐÖеĵÚÒ»ÓëµÚ¶þ¸ö¸ö²ÎÊý
# awk '{print $1,$2}' test.txt
this is
ÏÔʾÎı¾µÄÒ»ÐÐÖеĵÚÒ»¸öÓëµÚ¶þ¸ö²ÎÊý£¬Öмä¿ÉÒÔ¼Ó#ºÅ
# awk 'BEGIN{OFS="#"}{print $1,$2}' test.txt
this#is
ÏÔʾÎı¾Öеĸ÷¸ö²ÎÊý£¬»¹¿ÉÒÔ¼ÓÐÞÊηû
# awk 'BEGIN{OFS=":"}{print $1,$2,$3,$4}' test.txt
this:is:a:test.
ÏÔʾÎı¾ÖеIJÎÊý£¬»¹¿ÉÒÔ¼ÓÐÞÊηû£¬»¹¿ÉÒÔ¼Ó×Ö·û´®
# awk 'BEGIN{OFS=":"}{print $1,"hello",$2}' test.txt
this:hello:is
Êä³öÈýÐУ¬×¢Òâ»»ÐÐÐèÒª¼Ó\n
# awk 'BEGIN { print "line one\nline two\nline three" }'
line one
line two
line three
¶þ¡¢awk±äÁ¿
2.1 awkÄÚÖñäÁ¿Ö®¼Ç¼±äÁ¿£º
FS: field separator£¬¶ÁÈ¡Îı¾Ê±ËùʹÓõÄ×ֶηָô·û
RS: Record separator£¬¶ÁÈ¡Îı¾ÐÅÏ¢ËùʹÓõĻ»Ðзû
OFS: Output Filed Separator: Êä³öÎı¾Ê±Ê¹ÓõÄ×ֶηָô·û
ORS£ºOutput Row Separator£ºÊä³öÎı¾Ê±Ê¹ÓõÄÐзָô·û
2.2 awkÄÚÖñäÁ¿Ö®Êý¾Ý±äÁ¿£º
NR: The number of input records£¬awkÃüÁîËù´¦ÀíµÄ¼Ç¼Êý£»Èç¹ûÓжà¸öÎļþ£¬Õâ¸öÊýÄ¿»á°Ñ´¦ÀíµÄ¶à¸öÎļþÖÐÐÐͳһ¼ÆÊý£»
NF£ºNumber of Field£¬µ±Ç°¼Ç¼µÄfield¸öÊý£»
FNR: ÓëNR²»Í¬µÄÊÇ£¬FNRÓÃÓڼǼÕý´¦ÀíµÄÐÐÊǵ±Ç°ÕâÒ»ÎļþÖб»×ܹ²´¦ÀíµÄÐÐÊý£»
ʵÀý·ÖÎö£º
ÏÔʾÎı¾µÄÐÐÊý
# awk '{print NR}' test.txt
ÏÔʾһÐÐ×ܹ²Óм¸¸ö²ÎÊý
# awk '{print NF}' test.txt
ÏÔʾÎı¾µÄ×îºóÒ»¸ö²ÎÊý
# awk '{print $NF}' test.txt
test.
ͬʱ²é¿´¶à¸öÎı¾
# awk '{print FNR}' test.txt /etc/fstab
1 ÏÔʾµÄÊǵÚÒ»¸öÎı¾µÄÐÐÊý
1 ÏÔʾµÄÊǵڶþ¸öÎı¾µÄµÚÒ»ÐÐÊý£¬Ò»´ËÀàÍÆ
2 ÏÔʾµÄÊǵڶþ¸öÎı¾µÄµÚ¶þÐÐÊý
3 ÏÔʾµÄÊǵڶþ¸öÎı¾µÄµÚÈýÐÐÊý
ARGV: Êý×飬±£´æÃüÁîÐб¾ÉíÕâ¸ö×Ö·û´®£¬Èçawk '{print $0}' a.txt b.txtÕâ¸öÃüÁîÖУ¬ARGV[0]±£´æawk£¬ARGV[1]±£´æa.txt£»
ARGC: awkÃüÁîµÄ²ÎÊýµÄ¸öÊý£»
FILENAME: awkÃüÁîËù´¦ÀíµÄÎļþµÄÃû³Æ£»
ENVIRON£ºµ±Ç°shell»·¾³±äÁ¿¼°ÆäÖµµÄ¹ØÁªÊý×飻
²é¿´»·¾³±äÁ¿
# awk 'BEGIN{print ENVIRON["PATH"]}'
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/
bin:/usr/sbin:/usr/bin:/usr/local/apache/bin:/usr/local/mysql/bin:/root/bin
2.3 Óû§×Ô¶¨Òå±äÁ¿
gawkÔÊÐíÓû§×Ô¶¨Òå×Ô¼ºµÄ±äÁ¿ÒÔ±ãÔÚ³ÌÐò´úÂëÖÐʹÓ㬱äÁ¿ÃûÃüÃû¹æÔòÓë´ó¶àÊý±à³ÌÓïÑÔÏàͬ£¬Ö»ÄÜʹÓÃ×Öĸ¡¢Êý×ÖºÍÏ»®Ïߣ¬ÇÒ²»ÄÜÒÔÊý×Ö¿ªÍ·¡£gawk±äÁ¿Ãû³ÆÇø·Ö×Ö·û´óСд¡£
2.3.1 Ôڽű¾Öи³Öµ±äÁ¿
ÔÚgawkÖиø±äÁ¿¸³ÖµÊ¹Óø³ÖµÓï¾ä½øÐÐ
2.3.2 ÔÚÃüÁîÐÐÖÐʹÓø³Öµ±äÁ¿
gawkÃüÁîÒ²¿ÉÒÔÔÚ¡°½Å±¾¡±ÍâΪ±äÁ¿¸³Öµ£¬²¢Ôڽű¾ÖнøÐÐÒýÓá£
ʵÀý·ÖÎö£º
Êä³öÒ»¸ö±äÁ¿£¬²¢¸³Öµ
# awk 'BEGIN{var="variable testing";print var}'
variable testing
# awk -v var="variable testing" 'BEGIN{print var}'
variable testing
Èý¡¢awk´òÓ¡¹¤¾ß£ºprintf
printfÃüÁîµÄʹÓøñʽ£º
printf format, item1, item2, ...
printfÒªµã£º
1¡¢ÆäÓëprintÃüÁîµÄ×î´ó²»Í¬ÊÇ£¬printfÐèÒªÖ¸¶¨format£»
2¡¢formatÓÃÓÚÖ¸¶¨ºóÃæµÄÿ¸öitemµÄÊä³ö¸ñʽ£»
3¡¢printfÓï¾ä²»»á×Ô¶¯´òÓ¡»»Ðзû£»ÐèÒªÌí¼Ó\n
format¸ñʽµÄָʾ·û¶¼ÒÔ%¿ªÍ·£¬ºó¸úÒ»¸ö×Ö·û£»ÈçÏ£º
%c: ÏÔʾµÚÒ»¸ö²ÎÊýµÄµÚÒ»¸ö×Ö·û
%d, %i£ºÊ®½øÖÆÕûÊý£»
%e, %E£º¿ÆÑ§¼ÆÊý·¨ÏÔʾÊýÖµ£»
%f: ÏÔʾ¸¡µãÊý£»
%g, %G: ÒÔ¿ÆÑ§¼ÆÊý·¨µÄ¸ñʽ»ò¸¡µãÊýµÄ¸ñʽÏÔʾÊýÖµ£»
%s: ÏÔʾ×Ö·û´®£»
%u: ÎÞ·ûºÅÕûÊý£»
%%: ÏÔʾ%×ÔÉí£»
ÐÞÊηû£º
N: ÏÔʾ¿í¶È£»
-: ×ó¶ÔÆë£»
+£ºÏÔʾÊýÖµ·ûºÅ£»
¾ÙÀý·ÖÎö£º
# awk '{printf "%c\n",$1}' test.txt
t ÏÔʾµÚÒ»¸ö²ÎÊýµÄµÚÒ»¸ö×Öĸ
# awk '{printf "%s\n",$1}' test.txt
this ÏÔʾµÚÒ»¸ö²ÎÊý
# awk '{printf "%10s\n",$1}' test.txt
this ÏÔʾʱÓÃÁË10¸ö×Ö·û´®£¬Ä¬ÈÏÊÇÓÒ¶ÔÆë
# awk '{printf "%-10s\n",$1}' test.txt
this ÏÔʾʱ×ó¶ÔÆë£¬ºóÃæÓÐ6¸ö¿Õ×Ö·û´®
# awk '{printf "%-10s,%-10s\n",$1,$2}' test.txt
this ,is
# awk '{printf "%-10s%-10s\n",$1,$2}' test.txt
this is
# awk -F: '{printf "%5d",$3}' /etc/passwd
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 99 81 28 69 77 38 70 32 47 51 74 16 68 100 2965534 43 42 500 501 502 503 2002 2003 2004 4004 2033 2034 4005 4006 4007 4011 4017 4018 4019 4026 4027 4028 48 25 101
# awk -F: '{printf "%-5d\n",$3}' /etc/passwd ×ó¶ÔÆë
# awk -F: '{printf "%+5d\n",$3}' /etc/passwd ÓÒ¶ÔÆë
# awk -F: '{printf "%-15s %i\n",$1,$3}' test.txt
this is a test. 0
ËÄ¡¢Êä³öÖØ¶¨Ïò
print items > output-file
print items >> output-file
print items | command
ÌØÊâÎļþÃèÊö·û£º
/dev/stdin£º±ê×¼ÊäÈë
/dev/sdtout: ±ê×¼Êä³ö
/dev/stderr: ´íÎóÊä³ö
/dev/fd/N: Ä³ÌØ¶¨ÎļþÃèÊö·û£¬Èç/dev/stdin¾ÍÏ൱ÓÚ/dev/fd/0£»
Àý×Ó£º
# awk -F: '{printf "%-15s %i\n",$1,$3 > "/dev/stderr" }' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
Îå¡¢awkµÄ²Ù×÷·û£º
5.1 ËãÊõ²Ù×÷·û£º
-x: ¸ºÖµ
+x: ת»»ÎªÊýÖµ£»
x^y:
x**y: ´Î·½
x*y: ³Ë·¨
x/y£º³ý·¨
x+y:
x-y:
x%y:
5.2 ×Ö·û´®²Ù×÷·û£º
Ö»ÓÐÒ»¸ö£¬¶øÇÒ²»ÓÃд³öÀ´£¬ÓÃÓÚʵÏÖ×Ö·û´®Á¬½Ó£»
5.3 ¸³Öµ²Ù×÷·û£º
=¡¢+=¡¢-=¡¢*=¡¢/=¡¢%=¡¢^=¡¢**=¡¢++¡¢--
ÐèҪעÒâµÄÊÇ£¬Èç¹ûijģʽΪ=ºÅ£¬´ËʱʹÓÃ/=/¿ÉÄÜ»áÓÐÓï·¨´íÎó£¬Ó¦ÒÔ/[=]/Ìæ´ú£»
5.4 ²¼¶ûÖµ
awkÖУ¬ÈκηÇ0Öµ»ò·Ç¿Õ×Ö·û´®¶¼ÎªÕ棬·´Ö®¾ÍΪ¼Ù£»
5.5 ±È½Ï²Ù×÷·û£º
x < y xСÓÚyÎªÕæ£¬·´Ö®Îª¼Ù
x <= y xСÓÚµÈÓÚyÎªÕæ£¬·´Ö®Îª¼Ù
x > y x´óÓÚyÎªÕæ£¬·´Ö®Îª¼Ù
x >= y x´óÓÚµÈÓÚyÎªÕæ£¬·´Ö®Îª¼Ù
x == y xºãµÈÓÚyÎªÕæ£¬·´Ö®Îª¼Ù
x != y x²»µÈÓÚyÎªÕæ£¬·´Ö®Îª¼Ù
x ~ y True if the string x matches the regexp denoted by y.
x !~ y True if the string x does not match the regexp denoted by y.
subscript in array True if the array array has an element with the
subscript subscript.
5.5 ±í´ïʽ¼äµÄÂß¼¹ØÏµ·û£º
&&£º Âß¼Óë
|| £ºÂß¼»ò
5.6 Ìõ¼þ±í´ïʽ£ºÏ൱ÓÚifÓï¾ä
¾ÙÀý£ºÈôa´óÓÚb£¬ÔòÈ¡a is max£¬·´Ö®È¡b is max
a=3
b=4
a>b?a is max:b is max
5.7 º¯Êýµ÷Óãº
function_name (para1,para2)
Áù¡¢awkµÄģʽ£º
awk 'program' input-file1 input-file2 ...
ÆäÖеÄprogramΪ:
pattern { action }
pattern { action }
...
6.1 ³£¼ûµÄģʽÀàÐÍ£º
1¡¢Regexp: ÕýÔò±í´ïʽ£¬¸ñʽΪ/regular expression/
ÀýÈ磺ÏÔʾÒÔr¿ªÍ·µÄÐÐ
# awk -F: '/^r/{print $1}' /etc/passwd
root
rpc
rpcuser
2¡¢expresssion£º±í´ïʽ£¬ÆäÖµ·Ç0»òΪ·Ç¿Õ×Ö·ûʱÂú×ãÌõ¼þ£¬È磺$1 ~ /foo/ »ò $1 == "magedu"£¬ÓÃÔËËã·û~(Æ¥Åä)ºÍ~!(²»Æ¥Åä)¡£
ÀýÌ⣺
ÏÔʾidºÅСÓÚµÈÓÚ2µÄÓû§ºÍidºÅ
# awk -F: '$3-1<5{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
# awk -F: '$3<=5{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
È¡³öĬÈÏshellΪbashµÄÓû§
# awk -F: '$7~"bash$"{print $1,$7}' /etc/passwd
root /bin/bash
student /bin/bash
visitor /bin/bash
myuseradd /bin/bash
ÏÔʾĬÈÏshell²»ÊÇbashµÄÓû§
# awk -F: '$7!~"bash"{print $1,$7}' /etc/passwd
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
3¡¢Ranges£º Ö¸¶¨µÄÆ¥Å䷶Χ£¬¸ñʽΪpat1,pat2
ÏÔʾidºÅΪ0»òÕßshellΪ/sbin/nologinµÄÓû§
# awk -F: '$3==0,$7~"nologin"{print $1,$3,$7}' /etc/passwd
root 0 /bin/bash
bin 1 /sbin/nologin
4¡¢BEGIN/END£ºÌØÊâģʽ£¬½öÔÚawkÃüÁîÖ´ÐÐǰÔËÐÐÒ»´Î»ò½áÊøÇ°ÔËÐÐÒ»´Î
# awk -F: '$3==0,$7~"nologin"{printf "%-10s%-20s\n",$1,$7}' /etc/passwd
root /bin/bash
bin /sbin/nologin
¿ÉÒÔÔÚÏÔʾʱÏÔʾ±íÍ·
# awk -F: 'BEGIN{print "Username shell"}{printf "%-10s%-20s\n",$1,$7}' /etc/passwd
Username shell
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
ÏÔʾ±íÍ·ºÍ±íβ
# awk -F: 'BEGIN{print "Username shell"} {printf "%-10s%-20s\n",$1,$7}END
{print "END OF report"}' /etc/passwd
Username shell
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
END OF report
5¡¢Empty(¿Õģʽ)£ºÆ¥ÅäÈÎÒâÊäÈëÐУ¬¶ÔÎļþÖеÄÿһÐÐ×öÆ¥Åä
# awk -F: '{printf "%-10s%-20s\n",$1,$7}' /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
6.2 ³£¼ûµÄAction£¨¶¯×÷£©
1¡¢Expressions:±í´ïʽ
2¡¢Control statements£º¿ØÖÆÓï¾ä£¨if¡¢while...do¡¢for....µÈ´ý)
3¡¢Compound statements:¸´ºÏÓï¾ä
4¡¢Input statements£ºÊäÈëÓï¾ä
5¡¢Output statements£ºÊä³öÓï¾ä
/ÕýÔò±í´ïʽ/£ºÊ¹ÓÃͨÅä·ûµÄÀ©Õ¹¼¯¡£
¹ØÏµ±í´ïʽ£º¿ÉÒÔÓÃÏÂÃæÔËËã·û±íÖеĹØÏµÔËËã·û½øÐвÙ×÷£¬¿ÉÒÔÊÇ×Ö·û´®»òÊý×ֵıȽϣ¬Èç$2>%1Ñ¡ÔñµÚ¶þ¸ö
×ֶαȵÚÒ»¸ö×ֶ㤵ÄÐС£
ģʽƥÅä±í´ïʽ£º
ģʽ£¬Ä£Ê½£ºÖ¸¶¨Ò»¸öÐеķ¶Î§¡£¸ÃÓï·¨²»ÄܰüÀ¨BEGINºÍENDģʽ¡£
BEGIN£ºÈÃÓû§Ö¸¶¨ÔÚµÚÒ»ÌõÊäÈë¼Ç¼±»´¦Àí֮ǰËù·¢ÉúµÄ¶¯×÷£¬Í¨³£¿ÉÔÚÕâÀïÉèÖÃÈ«¾Ö±äÁ¿¡£
END£ºÈÃÓû§ÔÚ×îºóÒ»ÌõÊäÈë¼Ç¼±»¶Áȡ֮ºó·¢ÉúµÄ¶¯×÷¡£
Æß¡¢¿ØÖÆÓï¾ä£º
7.1 if-else
Óï·¨£ºif (condition) {then-body} else {[ else-body ]}
ʵÀý·ÖÎö£º
ÈôÓû§ÊÇrootÔòÏÔʾ¡°admin¡±·ñÔòÏÔʾΪ¡°Common user¡±
# awk -F: '{if ($1=="root") print $1,"admin"; else print $1, "Common user"}' /etc/passwd
root admin
bin Common user
daemon Common user
adm Common user
lp Common user
ÕâÊǶÔÉÏÃæµÄÓï·¨¸ñʽ»¯ÁË£¬¿´ÆðÀ´¸üÃÀ¹Û
# awk -F: '{if ($1=="root") printf "%-15s: %s\n", $1,"Admin"; else printf "%-15s: %s\n", $1, "Common User"}' /etc/passwd
root : Admin
bin : Common User
daemon : Common User
adm : Common User
lp : Common User
ͳ¼ÆidºÅ´óÓÚµÈÓÚ500µÄÓû§¸öÊý
# awk -F: -v sum=0 '{if ($3>=500) sum++}END{print sum}' /etc/passwd
21
7.2 while
Óï·¨£º while (condition){statement1; statment2; ...}
ʵÀý·ÖÎö£º
ÏÔʾ×Ö·û´®´óÓÚµÈÓÚ8µÄ£¨Ã¿Ò»¸ö×Ö·û´®¶¼Òª×öÒ»ÏÂÅжϣ©
# awk -F: '{i=1;while (i<=NF) {if (length($i)>=8) {print $i}; i++ }}' /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin
/var/adm
/sbin/nologin
/var/spool/lpd
ÏÔʾ×Ö·û´®´óÓÚµÈÓÚ4µÄ
# awk -F: '{i=1;while (i<=NF){if (length($i)>=4) {print $i}; i++}}' /etc/passwd
root
root
/root
/bin/bash
/bin
/sbin/nologin
daemon
daemon
7.3 do-while
Óï·¨£º do {statement1, statement2, ...} while (condition)
ÏÔʾ×Ö·û´®Ð¡ÓÚµÈÓÚ4µÄ£¨×¢ÒâʹÓÃdoÓï¾äʱ£¬ÏÈÖ´ÐеÄÊÇÌõ¼þ£©
# awk -F: '{i=1;do {print $i;i++}while(i<=3)}' /etc/passwd
root
x
0
bin
7.4 for
Óï·¨£º for ( variable assignment; condition; iteration process) { statement1, statement2, ...}
ÀýÌ⣺
1¡¢ÏÔʾ×Ö·û´®´óÓÚµÈÓÚ4µÄ
# awk -F: '{for(i=1;i<=NF;i++) {if (length($i)>=4) {print $i}}}' /etc/passwd
root
root
/root
/bin/bash
2¡¢ÏÔʾ×Ö·û´®Ð¡ÓÚµÈÓÚ4µÄ
# awk -F: '{for(i=1;i<=3;i++) print $i}' /etc/passwd
root
x
0
bin
forÑ»·»¹¿ÉÒÔÓÃÀ´±éÀúÊý×éÔªËØ£º
Óï·¨£º for (i in array) {statement1, statement2
ÀýÈ磺ÏÔʾ
# awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%-15s:%i\n",A,BASH[A]}}' /etc/passwd
/bin/sync :1
/bin/bash :20
/sbin/nologin :31
/sbin/halt :1
/etc/tcsh :1
/sbin/shutdown :1
7.5 case
Óï·¨£ºswitch (expression) { case VALUE or /REGEXP/: statement1, statement2,... default:
statement1, ...}
7.6 break ºÍ continue
³£ÓÃÓÚÑ»·»òcaseÓï¾äÖÐ
7.7 next
Ìáǰ½áÊø¶Ô±¾ÐÐÎı¾µÄ´¦Àí£¬²¢½Ó×Å´¦ÀíÏÂÒ»ÐУ»ÀýÈ磬ÏÂÃæµÄÃüÁÏÔʾÆäIDºÅÎªÆæÊýµÄÓû§£º
# awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd
bin 1
adm 3
sync 5
halt 7
news 9
operator 11
°Ë¡¢awkÖÐʹÓÃÊý×é
8.1 Êý×é
array[index-expression]
index-expression¿ÉÒÔʹÓÃÈÎÒâ×Ö·û´®£»ÐèҪעÒâµÄÊÇ£¬Èç¹ûijÊý¾Ý×éÔªËØÊÂÏȲ»´æÔÚ£¬ÄÇôÔÚÒýÓÃÆäʱ£¬awk»á×Ô¶¯´´½¨´ËÔªËØ²¢³õʼ»¯Îª¿Õ´®£»Òò´Ë£¬ÒªÅжÏijÊý¾Ý×éÖÐÊÇ·ñ´æÔÚÄ³ÔªËØ£¬ÐèҪʹÓÃindex in arrayµÄ·½Ê½¡£Òª±éÀúÊý×éÖеÄÿһ¸öÔªËØ£¬ÐèҪʹÓÃÈçϵÄÌØÊâ½á¹¹£º
for (var in array) { statement1, ... }
ÏÔʾ¸÷¸öshellµÄ¸öÊýºÍ
# awk -F: '{shell[$NF]++}END{for(A in shell) {print A,shell[A]}}' /etc/passwd
1
/bin/sync 1
/bin/bash 20
/sbin/nologin 31
/sbin/halt 1
/etc/tcsh 1
/sbin/shutdown 1
ÆäÖУ¬varÓÃÓÚÒýÓÃÊý×éϱ꣬¶ø²»ÊÇÔªËØÖµ£»
ͳ¼ÆtcpÁ¬½Ó״̬µÄ¸öÊý£¨$6Ò²ÊÇ×îºóÒ»¸ö×ֶΣ¬¿ÉÒÔʹÓÃ$NF)
# netstat -ant | awk '/^tcp/ {STATE[$NF]++} END {for(a in STATE) print a, STATE[a]}'
LISTEN 11
ESTABLISHED 2
ÿ³öÏÖÒ»´Î±»/^tcp/ģʽƥÅäµ½µÄÐУ¬Êý×éS[$NF]¾Í¼Ó1£¬NFΪµ±Ç°Æ¥Åäµ½µÄÐеÄ
×îºóÒ»¸ö×ֶΣ¬´Ë´¦ÓÃÆäÖµ×öΪÊý×éSµÄÔªËØË÷Òý£»
ͳ¼Æ·ÃÎʱ¾µØµÄIP¼°¸öÊý
# awk '{count[$1]++}END{for(ip in count) {printf "%-20s:%d\n",ip,count[ip]}}'
/var/log/httpd/access_log
192.168.10.1 £º1
172.16.50.5 £º10
Ó÷¨ÓëÉÏÒ»¸öÀý×ÓÏàͬ£¬ÓÃÓÚͳ¼ÆÄ³ÈÕÖ¾ÎļþÖÐIPµØµÄ·ÃÎÊÁ¿
8.2 ɾ³ýÊý×é±äÁ¿
´Ó¹ØÏµÊý×éÖÐɾ³ýÊý×éË÷ÒýÐèҪʹÓÃdeleteÃüÁʹÓøñʽΪ£º
delete array[index]
¾Å¡¢awkµÄÄÚÖú¯Êý
split(string, array [, fieldsep [, seps ] ])
¹¦ÄÜ£º½«string±íʾµÄ×Ö·û´®ÒÔfieldsepΪ·Ö¸ô·û½øÐзָô£¬²¢½«·Ö¸ôºóµÄ½á¹û±£´æÖÁarrayΪÃûµÄÊý×éÖУ»Êý×éϱêΪ´Ó0¿ªÊ¼µÄÐòÁУ»
# netstat -ant | awk '/:80\>/{split($5,clients,":");IP[clients[1]]++}END{for(i in IP){print IP[i],i}}' | sort -rn | head -50
length([string])
¹¦ÄÜ£º·µ»Østring×Ö·û´®ÖÐ×Ö·ûµÄ¸öÊý£»
substr(string, start [, length])
¹¦ÄÜ£ºÈ¡string×Ö·û´®ÖеÄ×Ó´®£¬´Óstart¿ªÊ¼£¬È¡length¸ö£»start´Ó1¿ªÊ¼¼ÆÊý£»
system(command)
¹¦ÄÜ£ºÖ´ÐÐϵͳcommand²¢½«½á¹û·µ»ØÖÁawkÃüÁî
systime()
¹¦ÄÜ£ºÈ¡ÏµÍ³µ±Ç°Ê±¼ä
tolower(s)
¹¦ÄÜ£º½«sÖеÄËùÓÐ×ÖĸתΪСд
toupper(s)
¹¦ÄÜ£º½«sÖеÄËùÓÐ×ÖĸתΪ´óд
Ê®¡¢Óû§×Ô¶¨Ò庯Êý
×Ô¶¨Ò庯ÊýʹÓÃfunction¹Ø¼ü×Ö¡£¸ñʽÈçÏ£º
function F_NAME([variable])
{
statements
}
º¯Êý»¹¿ÉÒÔʹÓÃreturnÓï¾ä·µ»ØÖµ£¬¸ñʽΪ¡°return value¡±¡£
×÷Õߣºjilili