%d 十進制有符號整數 %u 十進制無符號整數 %f 浮點數 %s 字元串 %c 單個字元 %p 指針的值 %e 指數形式的浮點數 %x, %X 無符號以十六進製表示的整數 %0 無符號以八進製表示的整數 %g 自動選擇合適的表示法 \n 換行 \f 清屏並換頁 \r 回車 \t Tab符 \xhh 表示一個ASCII碼用16進表示,其中hh是1到2個16進制數 說明: (1). 可以在"%"和字母之間插進數字表示最大場寬。 例如: %3d 表示輸出3位整型數, 不夠3位右對齊。 %9.2f 表示輸出場寬為9的浮點數, 其中小數位為2, 整數位為6,小數點占一位, 不夠9位右對齊。 %8s 表示輸出8個字元的字元串, 不夠8個字元右對齊。 如果字元串的長度、或整型數位數超過說明的場寬, 將按其實際長度輸出.但對浮點數, 若整數部分位數超過了說明的整數位寬度, 將按實際整數位輸出;若小數部分位數超過了說明的小數位寬度, 則按說明的寬度以四捨五入輸出. 另外, 若想在輸出值前加一些0, 就應在場寬項前加個0。 例如: %04d 表示在輸出一個小於4位的數值時, 將在前面補0使其總寬度為4位。 如果用浮點數表示字元或整型量的輸出格式, 小數點後的數字代表最大寬度,小數點前的數字代表最小寬度。 例如: %6.9s 表示顯示一個長度不小於6且不大於9的字元串。若大於9, 則第9個字元以後的內容將被刪除。 echo 1.7 > 2 awk '{printf ("%d\n",$1)} 2 1 awk '{printf ("%f\n",$1)}' 2 1.700000 awk '{printf ("%3.1f\n",$1)}' 2 1.7 awk '{printf ("%4.1f\n",$1)}' 2 1.7 awk '{printf ("%e\n",$1)}' 2
print 拼裝rm命令實現,查找檔案並刪除
#!/bin/sh LOCATE=/home/samba find $LOCATE -name '*.eml'>log find $LOCATE -name '*.nws'>>log gawk '{print "rm -rf "$1}' log > rmfile chmod 755 rmfile ./rmfile
輸出包含(不包含)特定字元的行(sed也可以完成該功能): :~$ awk '/[a-c]/ { print }' file.txt daemon x 1 1 daemon /usr/sbin /bin/sh bin x 2 2 bin /bin /bin/sh sys x 3 3 sys /dev /bin/sh sync x 4 65534 sync /bin /bin/sync games x 5 60 games /usr/games /bin/sh man x 6 12 man /var/cache/man /bin/sh lp x 7 7 lp /var/spool/lpd /bin/sh mail x 8 8 mail /var/mail /bin/sh news x 9 9 news /var/spool/news /bin/sh uucp x 10 10 uucp /var/spool/uucp /bin/sh proxy x 13 13 proxy /bin /bin/sh www-data x 33 33 www-data /var/www /bin/sh backup x 34 34 backup /var/backups /bin/sh list x 38 38 Mailing List Manager /var/list /bin/sh irc x 39 39 ircd /var/run/ircd /bin/sh gnats x 41 41 Gnats Bug-Reporting System (admin) /var/lib/gnats /bin/sh nobody x 65534 65534 nobody /nonexistent /bin/sh libuuid x 100 101 /var/lib/libuuid /bin/sh syslog x 101 103 /home/syslog /bin/false sshd x 102 65534 /var/run/sshd /usr/sbin/nologin landscape x 103 108 /var/lib/landscape /bin/false mysql x 104 112 MySQL Server,,, /var/lib/mysql /bin/false ntpd x 105 114 /var/run/openntpd /bin/false postfix x 106 115 /var/spool/postfix /bin/false nagios x 107 117 /var/lib/nagios /bin/false chun x 1003 1003 Li Fu Chun,,, /home/chun munin x 108 118 /var/lib/munin /bin/false $ awk '!/[a-c]/ { print }' file.txt root x 0 0 root /root neo x 1000 1000 neo,,, /home/neo 採用判斷來輸出特定的列數據: neo@monitor:~$ sed -e 's/:/ /g' /etc/passwd | awk '$1 == "neo" { print $1 }' neo 部分包含,不包含指定的字元: $ awk '$1 ~ /[a-d]/ { print }' file.txt $ awk '$1 !~ /[a-d]/ { print }' file.txt
# awk '/www/,/Web/ {print}' /etc/passwd www:x:80:80:Web User:/www:/bin/bash # awk '/www/,/[Ww]eb/ {print}' /etc/passwd www:x:80:80:Web User:/www:/bin/bash
cat /var/log/rinetd.log | awk -F' ' '$7 ~ /0/ {print $1"\t"$2"\t"$7"\t"$8"\t"$9}'
# cat /var/log/rinetd.log | awk -F' ' '$7 ~ /(210|209|210)/ {print $1"\t"$2"\t"$7"\t"$8"\t"$9}'
例如 : awk 讀入第一筆數據行 "aaa bbb ccc ddd" 之後, 程序中: $0 之值將是 "aaa bbb ccc ddd" $1 之值為 "aaa" $2 之值為 "bbb" $3 之值為 "ccc" $4 之值為 "ddd" $NF 之值為 4 $NR 之值為 1
NR=n 指定n行號
# awk -F':' 'NR==1 {print $(1)}' /etc/passwd root # awk -F':' 'NR==2 {print $(1)}' /etc/passwd bin
取 1,3,4行
# awk 'NR==1; NR==3; NR==4 {print $1}' /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
awk ... '{if(NR=1){...}else{exit)}'
$ awk -F' ' '{if(NR==1) print $1}' /etc/issue Ubuntu
# echo "aaa bbb ccc ddd" | awk '{print $(NR)}' aaa # echo "aaa bbb ccc ddd" | awk '{print $(NR+1)}' bbb # echo "aaa bbb ccc ddd" | awk '{print $(NR+2)}' ccc # echo "aaa bbb ccc ddd" | awk '{print $(NF)}' ddd # echo "aaa bbb ccc ddd" | awk '{print $(NF-1)}' ccc # echo "aaa bbb ccc ddd" | awk '{print $(NF-2)}' bbb uptime | awk '{print $(NF-2)}'
[root@netkiller ~]# netstat -na |awk '/^tcp/ {print NF}' | head -n 1 6 [root@netkiller ~]# netstat -ant |awk '/^tcp/ {print $NF}' | tail -n 5 TIME_WAIT CLOSE_WAIT CLOSE_WAIT LISTEN LISTEN [root@netkiller ~]# netstat -ant |awk '/^tcp/ {print $(NF-5)}' | tail -n 5 tcp tcp tcp tcp6 tcp6
[root@netkiller ~]# ss -ant | awk '{++S[$1]} END {for(a in S) print a, S[a]}' LISTEN 13 CLOSE-WAIT 42 ESTAB 95 State 1 FIN-WAIT-2 20 LAST-ACK 44 SYN-SENT 10 TIME-WAIT 403
[root@netkiller ~]# ss -ant | awk 'BEGIN {stats["CLOSE-WAIT"]=0;stats["ESTAB"]=0;stats["FIN-WAIT-1"]=0;stats["FIN-WAIT-2"]=0;stats["LAST-ACK"]=0;stats["SYN-RECV"]=0;stats["SYN-SENT"]=0;stats["TIME-WAIT"]=0} {++stats[$1]} END {for(a in stats) print a, stats[a]}' LISTEN 6 SYN-RECV 0 ESTAB 4 CLOSE-WAIT 0 State 1 FIN-WAIT-1 0 LAST-ACK 0 FIN-WAIT-2 0 TIME-WAIT 3 SYN-SENT 0
netstat -ant | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}' TIME_WAIT 88 CLOSE_WAIT 6 FIN_WAIT1 9 FIN_WAIT2 9 ESTABLISHED 303 SYN_RECV 126 LAST_ACK 5 ss | awk '$1 !~ /State/ {++state[$1]} END {for(key in state) print key,"\t",state[key]}' LAST-ACK 1 ESTAB 5 FIN-WAIT-2 1 CLOSE-WAIT 13
# cat /etc/passwd | awk -F':' '{++shell[$NF]} END {for(key in shell) print key,"\t",shell[key]}' /sbin/shutdown 1 /bin/sh 1 /bin/bash 3 /sbin/nologin 20 /sbin/halt 1 /bin/sync 1
# cat /www/logs/access.log | egrep -o 'GET|POST' | awk '{++method[$NF]} END {for(num in method) print num, method[num]}' POST 422 GET 188571 # cat /www/logs/access.log | egrep -o 'GET|POST' | awk '{++method[$1]} END {for(num in method) print num, method[num]}' POST 422 GET 188573