ºìÁªLinuxÃÅ»§
Linux°ïÖú

Îı¾´¦Àí¹¤¾ßAWKÏê½â

·¢²¼Ê±¼ä:2014-07-07 10:24:24À´Ô´:ºìÁª×÷Õß:velcbo
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
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ