文字三劍客 gawk基礎

2021-08-06 04:37:00 字數 4120 閱讀 4933

gawk程式是unix中原始awk程式的gnu版本。gawk程式讓流編輯器邁上了乙個新的台階,它提供了一種程式語言而不只是編輯器命令。在gawk程式語言中,可以完成下面的事情:

(1)定義變數來儲存資料;

(2)使用算數和字串操作符來處理資料;

(3)使用結構化程式設計概念(比如if-then語句和迴圈)來為資料處理增加處理邏輯;

(4)通過提取資料檔案中的資料元素,將其重新排列或格式化,生成格式化報表;

gawk程式的報告生成能力通常用來從大文字檔案中提取資料元素,並將它們格式化成可讀的報告。其中完美的例子是格式化日誌檔案。在日誌檔案中找出錯誤行會很難,gawk程式可以讓你從日誌檔案中過濾出需要的資料元素,然後你可以將其格式化,使得重要的資料易於閱讀。

gawk option program file

選項: 描述

-f fs 指定行中劃分資料字段的字段分隔符

-f file 從指定的檔案中讀取程式

-v var=value 定義gawk程式中的乙個變數及其預設值

-mf n 指定要處理的資料檔案中的最大字段數

-mr n 指定資料檔案中的最大資料行數

-w keyword 指定gawk的相容模式或警告等級

命令列選項提供了乙個簡單的途徑來定製gawk程式中的功能。

gawk的強大之處在於程式指令碼,可以寫指令碼來讀取文字行的資料,然後處理並顯示資料,建立任何型別的輸出報告。

(1)gawk程式及指令碼用一對花括號來定義。你必須將命令放到兩個花括號「{}」中。如果你錯誤的使用了圓括號來包含gawk指令碼,就會出錯。

(2)由於gawk命令列假定指令碼是單個文字字串,你還必須將指令碼放到單引號中。

例如:

[root@centos7 ~]# gawk ''
執行這個命令,你可能會有些失望,因為什麼都不會發生。原因在於沒有在命令列上指定檔名,所有gawk程式會從stdin接受資料。在執行這個程式時,它會一直等待從stdin輸入的文字。

如果你輸入一行文字並按下回車鍵,gawk會對這行文字執行一遍程式指令碼。跟sed編輯器一樣,gawk程式會針對資料流中的每一行文字執行程式。由於程式指令碼被設為顯示一行固定的文字字串,因此不管你在資料流中輸入什麼文字,都會得到同樣的文字輸出。

[root@centos7 ~]# gawk ''

thie is a error test

hello world!

hello world!

hello world!

要終止這個程式,你必須標明資料流已經結束了。bash shell提供了乙個組合鍵倆生成eof(end –of-file)字元。ctrl + d 組合鍵會字bash中產生乙個eof字元。這個組合鍵能夠終止該gawk程式並返回到命令列介面提示符下。

$0  代表整個文字行

$1 代表文字行的第乙個資料段

$n 代表文字行的第n個資料段

在文字行中,每個資料段都是通過字段分隔符劃分的。gawk在讀取一行文字時,會用預定義的字段分隔符劃分每個字段。gawk中預設的字段分隔符是任意的空白字元(例如空格或者製表符)。

例如,用-f指定字段分隔符。顯示系統密碼檔案的第乙個資料字段。由於/etc/passwd用冒號來分隔資料字段,因而可以將冒號指定為字段分隔符。

[root@centos7 ~]# gawk -f : '' /etc/passwd

root

bindaemon

admlp

sync

shutdown

halt

mail

operator

[……]

gawk程式語言允許將多條命令組合成乙個正常程式。要在命令列上的程式指令碼中使用多條命令,只要在命令之間放個分號即可。

例如

[root@centos7 ~]# echo "my name is centos"|gawk ''

my name is hahaha

第一條命令會給$4賦值。第二條命令會列印整個資料字段。注意,gawk程式在輸出中已經將原文本中的第四個資料字段替換了新值。

跟sed編輯器一樣,gawk編輯器允許將程式儲存到檔案中,然後再在命令列中引用。

[root@centos7 ~]# cat script2.gawk 

[root@centos7 ~]# gawk -f: -f script2.gawk /etc/passwd

root's' home directory is /root

bin's' home directory is /bin

daemon's' home directory is /sbin

adm's' home directory is /var/adm

lp's' home directory is /var/spool/lpd

sync's' home directory is /sbin

shutdown's' home directory is /sbin

halt's' home directory is /sbin

mail's' home directory is /var/spool/mail

[……]

script2.gawk程式指令碼會再次使用print命令列印/etc/passwd檔案中的主目錄資料字段(字段變數$6),以及userid資料字段(字段變數$1)。

可以在程式檔案中指定多條命令。要這麼做的話,只有一天命令放一行即可,不需要使用分號。

[root@centos7 ~]# cat script3.gawk 

[root@centos7 ~]# gawk -f: -f script3.gawk /etc/passwd

root's home directory is /root

bin's home directory is /bin

daemon's home directory is /sbin

adm's home directory is /var/adm

lp's home directory is /var/spool/lpd

sync's home directory is /sbin

shutdown's home directory is /sbin

[……]

script3.gawk程式指令碼定義了乙個變數來儲存print命令中用到的文字字串。

注意:gawk程式在引用變數值時並未像shell指令碼一樣使用美元符。

gawk還允許指定程式指令碼何時執行。預設情況下,gawk會從輸入中讀取一行文字,然後針對該行的資料執行程式指令碼。有時可能會需要在處理資料前執行指令碼,比如報告建立標題。begin關鍵字就是用來做這個的。它會強制gawk在讀取資料前執行begin關鍵字後指定的程式指令碼。

[root@centos7 ~]# cat data3.txt 

line 1

line 2

line 3

[root@centos7 ~]# gawk 'begin' data3.txt the data3 file contents:

line 1

line 2

line 3

在gawk執行了begin指令碼後,它會用第二段指令碼來處理檔案資料。這麼做是要小心,兩段指令碼仍然被認為是gawk命令列中的乙個文字字串。你需要相應的加上單引號。

與begin關鍵字類似,end關鍵字允許你指定乙個程式指令碼,gawk會在讀完資料後執行它。

[root@centos7 ~]# gawk ' end' data3.txt 

line 1

line 2

line 3

end of file

當gawk程式列印完檔案內容後,會執行end指令碼中的命令。這是在處理完所有正常資料後給報告新增頁尾的最佳方法。

文字三劍客

檔案萬用字元和正規表示式 文字過濾工具grep linux系統中,一切皆檔案。強大的文字編輯和處理工具便必不可少了,在linux系統中,有文字處理三劍客 grep,sed,awk。在進行介紹三大工具前,我們先總結一下檔案萬用字元和正規表示式。檔案萬用字元主要就是對檔案的查詢進行檔名的模糊查詢,而正規...

文字三劍客 awk gawk 基礎

gawk程式是unix中原始awk程式的gnu版本。gawk程式讓流編輯器邁上了乙個新的台階,它提供了一種程式語言而不只是編輯器命令。在gawk程式語言中,可以完成下面的事情 1 定義變數來儲存資料 2 使用算數和字串操作符來處理資料 3 使用結構化程式設計概念 比如if then語句和迴圈 來為資...

文字三劍客 sed

sed是linux中支援正規表示式的流編輯器 作用 修改和替換文字 sed擁有兩個兩個空間,分別是pattern space和hold space pattern space是處理資料的地方 注意 每處理一行資料後,模式空間就會清空 hold space是臨時存放資料的地方 模式空間 pattern...