awk是乙個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。
awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 awk 的 gnu 版本。
awk其名稱得自于它的創始人 alfred aho 、peter weinberger 和 brian kernighan 姓氏的首個字母。實際上 awk 的確擁有自己的語言: awk 程式語言 , 三位建立者已將它正式定義為「樣式掃瞄和處理語言」。它允許您建立簡短的程式,這些程式讀取輸入檔案、為資料排序、處理資料、對輸入執行計算以及生成報表,還有無數其他的功能。
樣式處理功能
cat /etc/passwd|head -5#result
root:x:
0:0:root:/root:/bin/bash
bin:x:
1:1:bin:/bin:/sbin/nologin
daemon:x:
2:2:daemon:/sbin:/sbin/nologin
adm:x:
3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
處理後:
cat /etc/passwd|head -10|awk -f ':''begin end
'#result
name,shell
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
lp,/sbin/nologin
blue,/bin/nosh
awk工作流程是這樣的:先執行beging,然後讀取檔案,讀入有/n換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第乙個域,$n表示第n個域,隨後開始執行模式所對應的動作action。接著開始讀入第二條記錄······直到所有的記錄都讀完,最後執行end操作。
模板匹配功能
awk''
pattern 表示 awk 在資料中查詢的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程式中始終出現,但它們用於根據特定的模式對一系列指令進行分組。 pattern就是要表示的正規表示式,用斜槓括起來。
比如:搜尋/etc/passwd有root關鍵字的所有行
awk -f: '/root/
' /etc/passwd
#result
root:x:
0:0:root:/root:/bin/bash
operator:x:
11:0:operator:/root:/sbin/nologin
這種是pattern的使用示例,匹配了pattern(這裡是root)的行才會執行action(沒有指定action,預設輸出每行的內容)。搜尋支援正則,例如找root開頭的: awk -f: '/^root/' /etc/passwd
搜尋/etc/passwd有root關鍵字的所有行,並顯示對應的shell
awk -f: '/root/
' /etc/passwd
#result
/bin/bash
/sbin/nologin
awk內建變數
awk有許多內建變數用來設定環境資訊,這些變數可以被改變,下面給出了最常用的一些變數。
argc 命令列引數個數ar** 命令列引數排列
environ 支援佇列中系統環境變數的使用
filename awk瀏覽的檔名
fnr 瀏覽檔案的記錄數
nr 已讀的記錄數
nf 瀏覽記錄的域的個數
fs 設定輸入域分隔符,等價於命令列 -f選項
ofs 輸出域分隔符
rs 控制記錄分隔符
ors 輸出記錄分隔符
統計/etc/passwd:檔名,每行的行號,每行的列數,對應的完整行內容:
awk -f ':''' /etc/passwd
使用printf替代print,可以讓**更加簡潔,易讀
awk -f ':''' /etc/passwd
awk中同時提供了print和printf兩種列印輸出的函式。其中print函式的引數可以是變數、數值或者字串。字串必須用雙引號引用,引數用逗號分隔。如果沒有逗號,引數就串聯在一起而無法區分。printf函式,其用法和c語言中printf基本相似,可以格式化字串,輸出複雜時,printf更加好用,**更易懂。
awk程式設計
變數和賦值
除了awk的內建變數,awk還可以自定義變數。下面統計/etc/passwd的賬戶人數
awk' end
' /etc/passwd
root:x:
0:0:root:/root:/bin/bash ...
user count is
40
這裡沒有初始化count,雖然預設是0,但是妥當的做法還是初始化為0:
awk'begin end
' /etc/passwd
[start]user count is
0root:x:
0:0:root:/root:/bin/bash
...
[end]user count is
40
統計某個資料夾下的檔案占用的位元組數
ls -l |awk'begin end
'[end]size is
439289
如果以m為單位顯示:
ls -l |awk'begin end
'[end]size is
0.418939 m
條件語句
if(expression)
if(expression)
else
if(expression)
else
if(expression1)
else
迴圈語句
awk中的迴圈語句同樣借鑑於c語言,支援while、do/while、for、break、continue,這些關鍵字的語義和c語言中的語義完全相同。
陣列
因為awk中陣列的下標可以是數字和字母,陣列的下標通常被稱為關鍵字(key)。值和關鍵字都儲存在內部的一張針對key/value應用hash的**裡。由於hash不是順序儲存,因此在顯示陣列內容時會發現,它們並不是按照你預料的順序顯示出來的。陣列和變數一樣,都是在使用時自動建立的,awk也同樣會自動判斷其儲存的是數字還是字串。一般而言,awk中的陣列用來從記錄中收集資訊,可以用於計算總和、統計單詞以及跟蹤模板被匹配的次數等等。
顯示/etc/passwd的賬戶
awk -f ':''begin ; end
' /etc/passwd
0root
1bin
2daemon
3adm4lp
...
計算兩個檔案的差集
awk'if(nr!=fnr && !($1 in a))print}
' file1 file2
awk程式設計的內容極多,這裡只羅列簡單常用的用法,更多請參考
awk命令簡介
在shell命令或程式設計中,可以用awk強大的的文字處理能力。如果要格式化報文或從乙個大的文字檔案中抽取資料報,那麼awk可完成這些任務。awk是一種解釋的程式語言。awk也是shell過濾工具中最難掌握的。awk是一種自解釋的程式語言。結合awk和sed和grep,將會使awk程式設計更加容易。...
awk陣列簡介
一 定義 在 awk 中,陣列是關聯陣列,它的特點是 1 陣列的下標可以是整數,也可以是負數甚至是字串 2 陣列的下標可以不連續。awk 的變數 ignorecase 的值不影響陣列下標。當 awk 建立乙個陣列的時候,如果沒有指定下標,預設已連續整數作為下標,起始值是 1.awk 的陣列是什麼高效...
awk陣列簡介
一 定義 在 awk 中,陣列是關聯陣列,它的特點是 1 陣列的下標可以是整數,也可以是負數甚至是字串 2 陣列的下標可以不連續。awk 的變數 ignorecase 的值不影響陣列下標。當 awk 建立乙個陣列的時候,如果沒有指定下標,預設已連續整數作為下標,起始值是 1.awk 的陣列是什麼高效...