AWK是一種優良的文本處理工具,Linux及Unix環境中現有的功能最強大的資料處理引擎之一.
這篇部落格是http://coolshell.cn/articles/9070.html的讀書筆記。
---
//
//按列輸出
//
首先,用
netstat > netstat.txt
命令把netstat的結果重新導向到netstat.txt中
結果類似這樣:
Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 localhost:37745 localhost:4730 ESTABLISHEDtcp 0 0 localhost:48344 localhost:4730 ESTABLISHEDtcp 0 0 localhost:4730 localhost:48344 ESTABLISHEDtcp 0 0 localhost:48342 localhost:4730 ESTABLISHEDtcp 0 52 ip-10-156-238-114.a:ssh li476-220.members:49359 ESTABLISHEDtcp 0 0 localhost:4730 localhost:37741 ESTABLISHEDtcp 0 0 localhost:48340 localhost:4730 ESTABLISHEDtcp 0 0 localhost:48341 localhost:4730 ESTABLISHEDtcp 0 1 ip-10-156-238-114.:http 60.175.244.116:5268 FIN_WAIT1
現在,我要列印第一列($1)和第四列($4),注意$0表示整行
awk '{print $1, $4}' netstat.txt結果如下:
Proto Local tcp localhost:37745tcp localhost:48344tcp localhost:4730tcp localhost:48342tcp ip-10-156-238-114.a:sshtcp localhost:4730tcp localhost:48340tcp localhost:48341tcp ip-10-156-238-114.:http
//
//過濾記錄
//
下面過濾條件為:第三列的值為0 && 第6列的值為ESTABLISHED
awk '$3==0 && $6=="ESTABLISHED"' netstat.txt
結果:
tcp 0 0 localhost:37745 localhost:4730 ESTABLISHEDtcp 0 0 localhost:48344 localhost:4730 ESTABLISHEDtcp 0 0 localhost:4730 localhost:48344 ESTABLISHEDtcp 0 0 localhost:48342 localhost:4730 ESTABLISHEDtcp 0 0 localhost:4730 localhost:37741 ESTABLISHED
//
//內建變數
//
$0 目前記錄(這個變數中存放著整個行的內容)
$1~$n 目前記錄的第n個欄位,欄位間由FS分隔
FS 輸入欄位分隔符號 預設是空格或Tab
NF 目前記錄中的欄位個數,就是有多少列
NR
已經讀出的記錄數,就是行號,從1開始,如果有多個檔案話,這個值也是不斷累加中。
FNR 目前記錄數,與NR不同的是,這個值會是各個檔案自己的行號
RS 輸入的記錄分隔字元, 預設為分行符號
OFS
輸出欄位分隔符號, 預設也是空格
ORS 輸出的記錄分隔字元,預設為分行符號
FILENAME 當前輸入檔案的名字
輸出行號的例子:
awk '$3==0 && $6=="ESTABLISHED" || NR==1 {printf "%2s %-20s %-20s %s\n", NR, $4, $5, $6}' netstat.txt
結果:
1 (w/o servers) 3 localhost:37745 localhost:4730 ESTABLISHED 4 localhost:48344 localhost:4730 ESTABLISHED 5 localhost:4730 localhost:48344 ESTABLISHED 6 localhost:48342 localhost:4730 ESTABLISHED 8 localhost:4730 localhost:37741 ESTABLISHED 9 localhost:48340 localhost:4730 ESTABLISHED10 localhost:48341 localhost:4730 ESTABLISHED12 localhost:4730 localhost:37747 ESTABLISHED
//
//指定分隔字元
//
awk 'BEGIN{FS=":"} {print $1, $3, $6}' /etc/passwd
說明:
BEGIN{ 這裡面放的是執行前的語句 }
END {這裡面放的是處理完所有的行後要執行的語句 }
結果:
root 0 /rootbin 1 /bindaemon 2 /sbinadm 3 /var/admlp 4 /var/spool/lpdsync 5 /sbin
上面的awk命令的另一種寫法是:
awk -F: '{print $1, $3, $6}' /etc/passwd
//
//正則匹配
//
awk '$6 ~/EST/ || NR==1 {print NR, $4, $5, $6}' OFS="\t" netstat.txt
上面的命令中 $6 ~/EST/部分就是正則匹配。表示對第6列使用正則, ~ 表示模式開始。/ /中是模式。
1 (w/o servers)3 localhost:37745 localhost:4730 ESTABLISHED4 localhost:48344 localhost:4730 ESTABLISHED5 localhost:4730 localhost:48344 ESTABLISHED6 localhost:48342 localhost:4730 ESTABLISHED
//
//統計
//
列出目前的目錄下所有php檔案的大小(即ls -l結果的第五列)
ls -l *.php | awk '{print $5}'
計算目前的目錄下所有php檔案的大小總和
ls -l *.php | awk '{sum+=$5} END {print sum}'
統計各個connection狀態(注意其中數組的用法)
awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}' netstat.txt
統計每個使用者的進程佔用了多少記憶體
ps aux | awk 'NR!=1{a[$1]+=$6} END {for (i in a) print i ", " a[i] "KB"}'