經常使用awk命令示例彙總

簡介

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

經過awk統計最經常使用的命令

下面的命令比較複雜,不過這是一個比較好玩的命令,這條命令能夠統計你最經常使用的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》 碼農 圖靈社區

相關文章
相關標籤/搜索