天天看點

Linux三大劍客之awk

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>

繼續閱讀