linux awk命令詳解一

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模式

  1. 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入門實例

  1. 顯示最近登錄的5個帳號.

    last -n 5 | awk  '{print $1}'

  2. 顯示/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"}'

  3. 搜索/etc/passwd有root關鍵字且以root開頭的所有行

    awk -F: '/^root/' /etc/passwd

  4. 統計/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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章