awk的名稱來源于其最初設計者Alfred V. Aho, Peter J. Weinberger, and Brian W. Kernighan的姓氏。awk最原始的版本是1977年在AT&T貝爾實驗室誕生的,awk經過改進生成的新的版本nawk,gawk,現在預設linux系統下日常使用的是gawk。我目前使用的作業系統為CentOS Linux release 7.2.1511,系統自帶的awk版本為:GNU Awk 4.0.2。
文本處理。
格式化輸出文本、報告。
數字運算(在我之前的文章中,探讨過整數的算術運算,浮點運算可以使用awk)。
執行字元串操作。
通過指令,我們可以看到:
與awk有關的指令竟然有這麼多!在用whatis指令看一下這些都是些什麼鬼:
不太确信以上結果,我又使用man、info挨個看了一下,結果awk、gawk、dgawk、pgawk都是gawk,線上手冊一模一樣。唯獨igawk與前面四個不太一樣,是包含檔案的gawk,其實也是gawk。awk是gawk的一個軟連接配接,大家都是gawk!
Read
awk從輸入流(檔案,管道或者标準輸入)中讀取一行,然後存儲到記憶體中。
Execute
所有的AWK指令都依次在輸入文本上執行。預設情況下,awk會對每一行執行指令,可以通過提供模式限制這種行為。
Repeat
處理過程不斷重複,從首行開始直到到達檔案結尾。
建立marks.txt檔案備用:
BEGIN 語句塊
BEGIN語句塊的文法:
BEGIN語句塊在程式開始的使用執行,隻執行一次,在這裡可以初始化變量。BEGIN是AWK的關鍵字,是以它必須為大寫。注意,這個語句塊是可選的。
BODY 語句塊
BODY語句塊的文法:
BODY語句塊中的指令會對輸入的每一行執行,也可以通過提供模式來控制這種行為。注意,BODY語句塊沒有關鍵字。
END 語句塊
END語句塊的文法:
END語句塊在程式的最後執行,END是AWK的關鍵字,是以必須為大寫,它也是可選的。
結合以上2點,舉個例子來了解一下:
在本例中,BEGIN塊被執行一次,給文本内容增加了一行标題。body塊從文本第一行掃描直至檔案末尾。END塊也僅僅執行了一次。
通常情況下,awk指令較簡短時我們直接按照以下方式執行awk指令:
如果awk内容較多的話,我們以以下格式來執行awk指令(此處program-file為awk腳本内容):
awk是一門解釋型的語言,是以也可以像執行bash shell一樣執行awk腳本:
預設情況下,awk以空格、制表符等符号為分隔符。從每一行的第一個字元串開始掃描,第一個字元串為$1,第N個字元串為$n,如果首行是空格之類的字元那也算。
當模式比對成功時,預設情況下awk會列印該行,但是也可以讓它隻列印指定的字段。例如,下面的例子中,隻會列印出比對模式的第三和第四個字段。
比對指定檔案中帶u的行,并列印第四列與第三列,中間以一個橫向制表符隔開。
此行指令中,BEGIN部分其實是可以省略的。
此處的BEGIN部分不能出現,否則報錯。
mark.txt檔案是通過空格來控制對齊的,每一行加上空格一共是22個字元。
注意:此處使用的是END,如果省略則會列印出5個檔案名稱,這個檔案一5行。
變量名
屬性
$0
目前記錄
$1-$n
目前記錄的第N個字段
FS
讀入字段的分隔符,預設為空格
RS
讀入記錄分隔符,預設為換行符
NF
列,目前記錄中的字段個數
NR
行,已經讀出的行數,也就是行号
OFS
輸出字段分隔符,預設為空格
ORS
輸出記錄分隔符,預設為換行符
以上三種寫法都是一樣的效果。
以上兩個代碼片中,都是統計目前目錄下所有的檔案(包括隐藏檔案)所占磁盤空間的大小,非常有用。
在awk中,支援像C語言中一樣的算術運算。在前面的文章中介紹過,Linux系統中無法對非整型數字直接進行算術運算,要對浮點型的資料就行算術運算我們可以使用awk來實作。
在這一部分中,awk中的增減運算符、指派運算符、關系操作符、邏輯運算符、三元操作符等均與C語言類似,不贅述。
數組的定義與C語言有類似的地方,也有差别,使用的時候需要注意一下,有的資料上說awk中不支援多元數組,通過awk的GUN的文檔,我們可以看到,awk也是支援多元數組的。删除數組元素使用delete語句:
在awk中,也支援類似C語言一樣的程式結構,支援if-else、while、do-while、for、switch、break、continue、nex、nextfile、exit。相信很多小夥伴都學習過C語言,與C語言一樣的就不在贅述。
在awk中,支援内建函數與使用者自定義函數。
常用數學計算函數
atan2(y, x)
cos(x)
exp(x)
int(x)
log(x)
rand()
sin(x)
sqrt(x)
srand([x])
字元串函數
時間函數
位元組操作函數
自定義函數類似于C語言,參閱GUN網站function部分。
<a href="https://www.tutorialspoint.com/awk/index.htm">https://www.tutorialspoint.com/awk/index.htm</a>
<a href="https://www.gnu.org/software/gawk/manual/gawk.html">https://www.gnu.org/software/gawk/manual/gawk.html</a>