linux awk命令詳解一
一.AWK簡介
awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時
,顯得尤爲強大。簡單來說awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部
分再進行各種分析處理。
awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 AWK 的 GNU 版本。
awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程序設計語言 , 三位創建者已將它正式定義爲“樣式掃描和處理語言”。它允許您創建簡短的程序,這些程序讀取輸入文件、爲數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。
格式 awk '{pattern + action}' {filenames}
示例:df -hP|awk '{print $1} ' 顯示文件系統的第一個字段
二.awk內置變量
awk有許多內置變量用來設置環境信息,這些變量可以被改變,下面給出了最常用的一些變量。
ARGC 命令行參數個數
ARGV 命令行參數排列
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk瀏覽的文件名
FNR 瀏覽文件的記錄數
FS 指定字段分隔符,等價於命令行 -F選項
NF 瀏覽記錄的域的個數
NR 已讀的記錄數
OFS 指定輸出字段分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符
其中,NF,OFS,ORS,FS最爲常用。
三.AWK選項
-F 指定字段分隔符
cat /etc/passwd |awk -F ':' '{print $1}' 顯示系統中所有的用戶的第一個字段
awk -F: '{print $1,$7}' /etc/passwd 顯示系統中所有的用戶的第一個和第七個字段
如果每一行的字段數不相同,又需要輸出每一行的第一個和第七個字段時,則需要使用系統中
的內置變量NF
awk -F: '{print $1,$NF}' /etc/passwd
-v 聲明一個變量
awk -v FS=: '{print $1,$7}' /etc/passwd
awk -v OFS=: '{print $1,$7}' /etc/passwd
四.AWK輸出重定向
print items > file 輸出到文件(覆蓋)
print items >> file 追加到文件
print items | command 輸出的結果通過管道給另外一個命令
**特殊的文件描述符
/dev/stdin 標準輸入
/dev/stdout 標準輸出
/dev/stderr 標準輸出
/dev/fd/N 某特定文件描述符,如/dev/stdin相當於/dev/fd/0
示例:
awk -F: '{printf "%-15s %i\n",$1,$3>"/dev/stderr"}' >/tmp/error.log
五.AWK模式
regexp:正則表達式,格式/regulai expression/
示例:打印匹配到的含有bash的行的第一和七個字段顯示出來
awk -F: '/bash/{print $1,$7}' /etc/passwd
2.expression:表達式,其值爲0或者非空是滿足條件。如$1 ~ /foo/或者$!=="foo"用運算符~和~
!匹配。
示例:
打印id號大於等於500的用戶名和ID
awk -F: '$3>=500{print $1,$3}' /etc/passwd
3.Ranges:指定匹配範圍,格式爲pat1,pat2
4.BEGIN/END :特殊模式,
示例:打印/etc/passwd文件中的用戶名和UID。
awk -F: 'BEGIN{print "username uid"}{printf "%-13s%s\n",$1,$3} END{print "print complete "}' /etc/passwd
5.empty :匹配任意輸入行
六.awk入門實例
顯示最近登錄的5個帳號.
last -n 5 | awk '{print $1}'
顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,而且在所有行添加列名name,shell,在最後一行添加"blue,/bin/nosh"。
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
搜索/etc/passwd有root關鍵字且以root開頭的所有行
awk -F: '/^root/' /etc/passwd
統計/etc/passwd:文件名,每行的行號,每行的列數,對應的完整行內容:
方法一:awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
方法二:awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd