一、awk基本用法
awk [options] 'scripts' file1,file2...
awk [options] 'pattern {action}' file1,file2...
# -F選項指定分隔符,$num,代表第num個字段 [root@docker1 ~]# awk -F: '{print $1,$3}' /tmp/passwd root 0 bin 1 daemon 2 adm 3 ...... #匹配正則表達式用:/正則表達式/,匹配以r開頭的行 [root@ju ~]# awk -F: '/^r/{print $1}' /tmp/passwd root rtkit #匹配第三列大於400的 [root@ju ~]# awk -F: '$3>=400{print $1,$3}' /tmp/passwd rtkit 499 saslauth 498 pulse 497 jenkins 496 #匹配第三列大於497的,支持加法 [root@ju ~]# awk -F: '$3>=400+97{print $1,$3}' /tmp/passwd rtkit 499 saslauth 498 pulse 497 #第七列以bash結尾的行 [root@ju ~]# awk -F: '$7~"bash$"{print $1,$3,$7}' /tmp/passwd root 0 /bin/bash #第七列不以bash結尾的行 [root@ju ~]# awk -F: '$7!~"bash$"{print $1,$3,$7}' /tmp/passwd bin 1 /sbin/nologin daemon 2 /sbin/nologin adm 3 /sbin/nologin lp 4 /sbin/nologin ......
二、awk內置變量
ARGC 命令行參數個數
ARGV 命令行參數排列
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk處理的文件名稱
FS 設置輸入域分隔符,等價於命令行 -F選項
NF 瀏覽記錄的域的個數
NR awk命令已處理的行記錄數;如果有多個文件,它會把處理的多個文件中行統一計數
FNR 與NR不同的是,FNR用於記錄正處理的行是當前這一文件中被總共處理的行數
OFS 輸出字段分隔符
ORS 輸出行分隔符
RS 輸入文本信息所使用的換行符
[root@docker1 ~]# awk -F: 'BEGIN{OFS="-----";}/^s/{print $1,$3}' /tmp/passwd sync-----5 shutdown-----6 saslauth-----498 sshd-----74 [root@docker1 ~]# awk 'BEGIN{FS=":";OFS="-----"}/^s/{print $1,$3}' /tmp/passwd sync-----5 shutdown-----6 saslauth-----498 sshd-----74
三、printf的格式用法
format格式的指示符都以%開頭,後跟一個字符;如下:
%c: 顯示字符的ASCII碼
%d, %i:十進制整數
%e, %E:科學計數法顯示數值
%f: 顯示浮點數
%g, %G: 以科學計數法的格式或浮點數的格式顯示數值
%s: 顯示字符串
%u: 無符號整數
%%: 顯示%自身
修飾符:
N: 顯示寬度;
-: 左對齊;
+:顯示數值符號;
[root@docker1 ~]# awk -F: '/^s/{printf "%-12s ----- %s\n",$1,$3}' /tmp/passwd sync ----- 5 shutdown ----- 6 saslauth ----- 498 sshd ----- 74
四、輸出重定向
print sth > outfile
print sth >> outfile
print sth | cmd
特殊文件描述符:
/dev/stdin:標準輸入
/dev/sdtout: 標準輸出
/dev/stderr: 錯誤輸出
/dev/fd/N: 某特定文件描述符,如/dev/stdin相當於/dev/fd/0
[root@docker1 ~]# awk -F: '/^r/{printf "%-13s bash is %s\n",$1,$7 > "/tmp/test" }' /tmp/passwd [root@docker1 ~]# cat /tmp/test root bash is /bin/bash rtkit bash is /sbin/nologin
五、BEGIN和END的使用
[root@ju ~]# awk -F: 'BEGIN{print "--------begin---------"}{printf "%-20s%-10s\n",$1,$3}END{print "-------over--------"}' /tmp/passwd --------begin--------- root 0 bin 1 daemon 2 adm 3 lp 4 ...... sshd 74 tcpdump 72 jenkins 496 -------over--------
六、控制語句
1、if-else語句
[root@docker1 ~]# awk -F: '{if ($7=="/sbin/nologin") printf "%-20s is %s\n", $1,"Nologin User"; else printf "%-20s is %s\n", $1, "Login User"}' /etc/passwd root is Login User bin is Nologin User daemon is Nologin User adm is Nologin User lp is Nologin User sync is Login User shutdown is Login User halt is Login User mail is Nologin User ......
2、while語句
[root@docker1 ~]# awk -F: '{i=1;while(i<=NF){if (length($i)>=20) {print $i " is too long"};i++}}' /tmp/passwd virtual console memory owner is too long /var/lib/avahi-autoipd is too long PulseAudio System Daemon is too long Privilege-separated SSH is too long Jenkins Continuous Integration Server is too long
3、do-while語句
[root@docker1 ~]# awk -F: '{i=1;do {print i;i++}while(i<=1)}' /etc/passwd 1 1 1 1 1 1 ......
4、for語句
[root@docker1 ~]# awk -F: '{for(i=1;i<=NF;i++) { if (length($i)>=20) {print $i " is too long"}}}' /etc/passwd virtual console memory owner is too long /var/lib/avahi-autoipd is too long PulseAudio System Daemon is too long Privilege-separated SSH is too long Jenkins Continuous Integration Server is too long
5、break和continue
[root@docker1 ~]# awk -F: '{i=1;while(i<=NF){print $i;i++;break }}' /tmp/passwd root bin daemon adm lp sync shutdown ......
6、next語句
[root@docker1 ~]# awk -F: '{if($1!="daemon") next;print $1}' /tmp/passwd daemon
七、awk中使用數組
[root@docker1 ~]# awk -F: '{UID[/^s/]++}END{for (i in UID){print i ,UID[i]}}' /tmp/passwd#以s開頭的有4行,非s開頭的有27行 0 27 1 4 [root@docker1 ~]# netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' ESTABLISHED 1 LISTEN 10
八、awk的內置函數
split(string, array [, fieldsep [, seps ] ])
功能:將string表示的字符串以fieldsep爲分隔符進行分隔,並將分隔後的結果保存至array爲名的數組中;數組下標爲從0開始的序列;
length([string])
功能:返回string字符串中字符的個數;
substr(string, start [, length])
功能:取string字符串中的子串,從start開始,取length個;start從1開始計數;
system(command)
功能:執行系統command並將結果返回至awk命令
systime()
功能:取系統當前時間
這裏只講到了awk的很小一部分功能,awk是一個非常強大的工具,以後有時間再慢慢研究吧,掌握以上這些已經足夠日常絕大部分情況下的使用了。