awk是一個強大的文本分析工具,是把文件逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首字母。實際上 AWK 的確擁有自己的語言: AWK程式 ...
awk是一個強大的文本分析工具,是把文件逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。
awk其名稱得自於它的創始人 Alfred Aho
、Peter Weinberger
和 Brian Kernighan
姓氏的首字母。實際上 AWK 的確擁有自己的語言: AWK程式設計語言,三位創建者已將它正式定義為“樣式掃描和處理語言”。它允許您創建簡短的程式,這些程式讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。
命令行
awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。預設的域分隔符是空格。
示例1
獲取當前目錄下所有文件大小
ls -l |awk '{print $5}'
讀入有"\n"換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域。所以$5表示文件大小以此類推。
示例2
顯示 /etc/passwd 的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割,並且在所有行前添加列名name,shell,在最後一行添加"blue,/bin/nosh"
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
示例3
搜索/etc/passwd有root關鍵字的所有行
awk -F: '/^root/' /etc/passwd
pattern的使用示例,匹配了pattern(這裡是以root開頭)的行才會執行action(沒有指定action,預設輸出每行的內容)。
示例4
統計/etc/passwd:文件名,每行的行號,每行的列數,對應的完整行內容
awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
FILENAME,NR,NF是內置變數,常用變數如下
- ARGC 命令行參數個數
- ARGV 命令行參數排列
- ENVIRON 支持隊列中系統環境變數的使用
- FILENAME awk瀏覽的文件名
- FNR 瀏覽文件的記錄數
- FS 設置輸入域分隔符,等價於命令行 -F選項
- NF 瀏覽記錄的域的個數
- NR 已讀的記錄數
- OFS 輸出域分隔符
- ORS 輸出記錄分隔符
- RS 控制記錄分隔符
結果:
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
使用printf替代print,可以讓代碼更加簡潔,易讀
awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
awk編程
略,留給運維同學去研究。
awk編程的內容超級多,更多請參考 The GNU Awk User’s Guide