awk是一個強大的文本處理工具,它主要是針對文本列來進行處理。awk的語法比較複雜,下面經過總結經常使用的例子來方便平常的工做使用。python
首先使用你喜好的文本編輯器建立包含下面內容的文件,這個文件將在下面使用到,最後文件名稱保存爲Awk.txt。linux
$ cat Awk.txt Line1 john.wang Male 30 021-11111111 Line2 lucy.yang Female 25 021-22222222 Line3 jack.chen Male 35 021-33333333 Line4 lily.gong Female 21 021-44444444 shanghai
awk默認是用空格和tab符來分割的,連續的空格和tab也能夠,例如,一個空格和一個tab符也默認看成一個分隔符來處理。 經過下面方法,來使用冒號「:」和「.」來分割。git
$ echo '1:2:3' | awk -F : '{ print $1, $2, $3, $1+$2+$3 }' #指定使用‘:’冒號分隔 1 2 3 6 $ cat Awk.txt | awk -F . '{ print $1, $2 }' #指定使用‘.’英文句號分隔 Line1 john wang Male 30 021-11111111 Line2 lucy yang Female 25 021-22222222 Line3 jack chen Male 35 021-33333333 Line4 lily gong Female 21 021-44444444 shanghai
能夠經過awk來對列進行過濾,打印顯示特定的列,其中變量NF是總列數。編輯器
$ cat Awk.txt | awk '{ print $2, $4 }' #打印姓名和年齡兩列 john.wang 30 lucy.yang 25 jack.chen 35 lily.gong 21 $ awk '{ print $2, $4 }' Awk.txt #和上面命令結果同樣,只是沒有使用管道 $ cat Awk.txt | awk '{ print $NF }' #打印最後一列 021-11111111 021-22222222 021-33333333 shanghai $ cat Awk.txt | awk '{ print $(NF-1) }' #打印倒數第二列 30 25 35 021-44444444
awk命令和實現head和tail已經sed等工具相似的功能來對文本的行進行過濾,顯示特定的行。工具
若是你對過濾特定的行有興趣,能夠看一下我寫的《利用linux命令行工具進行文本行過濾》 接下來利用awk來顯示特定的文本行,NR表明行號:.net
$ awk 'NR<=3' Awk.txt #顯示前3行 Line1 john.wang Male 30 021-11111111 Line2 lucy.yang Female 25 021-22222222 Line3 jack.chen Male 35 021-33333333 $ awk '(NR>=2)&&(NR<=3)' Awk.txt #顯示第2和3行 Line2 lucy.yang Female 25 021-22222222 Line3 jack.chen Male 35 021-33333333
使用下面方法來對特定的列進行求和命令行
$ seq 10 | awk '{ sum += $1} END { print sum }' #計算1到10的累加 55 $ cat Awk.txt | awk '{ sum += $4} END { print sum/NR }' #對第4列求和並計算平均年齡 27.75
下面的命令比較複雜,不過這是一個比較好玩的命令,這條命令能夠統計你最經常使用的10條命令。code
$ history | awk '{CMD[$2]++; count++;} END{ for (a in CMD) print CMD[a]" "CMD[a]/count*100"%" , a}' | > grep -v "./" | column -c 3 -s " " -t | sort -nr | nl | head -n 10 1 1037 13.4344% ls 2 808 10.4677% fg 3 657 8.51147% cd 4 639 8.27827% python3 5 316 4.09379% adb 6 291 3.76992% echo 7 283 3.66628% git 8 248 3.21285% ll 9 243 3.14808% sudo 10 218 2.8242% vi
awk其實也能夠算作是一種腳本語言,可是它和如今流行的python語言相比,語法不夠簡潔。並且awk也是比較古老的工具了,例如上面最後統計經常使用命令的例子,徹底能夠用python腳原本實現。固然python腳本代碼的行數就要比awk多,可是代碼的可讀性更好。因此awk仍是適合較小的任務,而python能夠完成更加複雜的工做。blog
《Linux系統命令及Shell腳本實踐指南》 王軍著get
《鳥哥的Linux私房菜》 鳥哥著
《碼農增刊 Linus與Linux》 碼農 圖靈社區