gawk程序是Unix中原始awk程序的GNU版本。gawk程序讓流編輯器邁上了一個新的臺階,它提供了一種編程語言而不只是編輯器命令。在gawk編程語言中,可以完成下面的事情:
(1)定義變量來保存數(shù)據(jù);
(2)使用算數(shù)和字符串操作符來處理數(shù)據(jù);
(3)使用結(jié)構(gòu)化編程概念(比如if-then語句和循環(huán))來為數(shù)據(jù)處理增加處理邏輯;
(4)通過提取數(shù)據(jù)文件中的數(shù)據(jù)元素,將其重新排列或格式化,生成格式化報表;
gawk程序的報告生成能力通常用來從大文本文件中提取數(shù)據(jù)元素,并將它們格式化成可讀的報告。其中完美的例子是格式化日志文件。在日志文件中找出錯誤行會很難,gawk程序可以讓你從日志文件中過濾出需要的數(shù)據(jù)元素,然后你可以將其格式化,使得重要的數(shù)據(jù)易于閱讀。

1 gawk命令格式

gawk option program file
    選項:     描述
    -F fs           指定行中劃分數(shù)據(jù)字段的字段分隔符
    -f file         從指定的文件中讀取程序
    -v var=value        定義gawk程序中的一個變量及其默認值
    -mf N           指定要處理的數(shù)據(jù)文件中的最大字段數(shù)
    -mr N           指定數(shù)據(jù)文件中的最大數(shù)據(jù)行數(shù)
    -W  keyword     指定gawk的兼容模式或警告等級

命令行選項提供了一個簡單的途徑來定制gawk程序中的功能。
gawk的強大之處在于程序腳本,可以寫腳本來讀取文本行的數(shù)據(jù),然后處理并顯示數(shù)據(jù),創(chuàng)建任何類型的輸出報告。

2 從命令行讀取程序腳本

(1)gawk程序及腳本用一對花括號來定義。你必須將命令放到兩個花括號“{}”中。如果你錯誤的使用了圓括號來包含gawk腳本,就會出錯。
(2)由于gawk命令行假定腳本是單個文本字符串,你還必須將腳本放到單引號中。
例如:

        [root@centos7 ~]# gawk '{print "Hello World!"}'

運行這個命令,你可能會有些失望,因為什么都不會發(fā)生。原因在于沒有在命令行上指定文件名,所有g(shù)awk程序會從STDIN接受數(shù)據(jù)。在運行這個程序時,它會一直等待從STDIN輸入的文本。
如果你輸入一行文本并按下回車鍵,gawk會對這行文本運行一遍程序腳本。跟sed編輯器一樣,gawk程序會針對數(shù)據(jù)流中的每一行文本執(zhí)行程序。由于程序腳本被設(shè)為顯示一行固定的文本字符串,因此不管你在數(shù)據(jù)流中輸入什么文本,都會得到同樣的文本輸出。

[root@centos7 ~]# gawk '{print "Hello World!"}'Thie is a error testHello World!Hello World!Hello World!

要終止這個程序,你必須標明數(shù)據(jù)流已經(jīng)結(jié)束了。bash shell提供了一個組合鍵倆生成EOF(End –of-File)字符。Ctrl + D 組合鍵會字bash中產(chǎn)生一個EOF字符。這個組合鍵能夠終止該gawk程序并返回到命令行界面提示符下。

3 使用數(shù)據(jù)字段變量

gawk的主要特征之一是其處理文本文件中數(shù)據(jù)的能力。它會自動給一行的每個數(shù)據(jù)元素分配一個變量。默認情況下,gawk會將如下變量分配給它在文本中發(fā)現(xiàn)的數(shù)據(jù)字段:

$0  代表整個文本行
$1  代表文本行的第一個數(shù)據(jù)段
$n  代表文本行的第n個數(shù)據(jù)段

在文本行中,每個數(shù)據(jù)段都是通過字段分隔符劃分的。gawk在讀取一行文本時,會用預定義的字段分隔符劃分每個字段。gawk中默認的字段分隔符是任意的空白字符(例如空格或者制表符)。
例如,用-F指定字段分隔符。顯示系統(tǒng)密碼文件的第一個數(shù)據(jù)字段。由于/etc/passwd用冒號來分隔數(shù)據(jù)字段,因而可以將冒號指定為字段分隔符。

[root@centos7 ~]# gawk -F : '{print $1}' /etc/passwdroot
bin
daemon
adm
lp
syncshutdownhalt
mail
operator
[……]

4 在程序腳本中使用多個命令

gawk編程語言允許將多條命令組合成一個正常程序。要在命令行上的程序腳本中使用多條命令,只要在命令之間放個分號即可。
例如

[root@centos7 ~]# echo "My name is centos"|gawk '{$4="hahaha";print $0}'My name is hahaha

第一條命令會給$4賦值。第二條命令會打印整個數(shù)據(jù)字段。注意,gawk程序在輸出中已經(jīng)將原文本中的第四個數(shù)據(jù)字段替換了新值。

5 從文本中讀取程序

跟sed編輯器一樣,gawk編輯器允許將程序存儲到文件中,然后再在命令行中引用。

[root@centos7 ~]# cat script2.gawk {print $1 "'s' home directory is " $6}
[root@centos7 ~]# gawk -F: -f script2.gawk  /etc/passwdroot'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文件中的主目錄數(shù)據(jù)字段(字段變量$6),以及userID數(shù)據(jù)字段(字段變量$1)。
可以在程序文件中指定多條命令。要這么做的話,只有一天命令放一行即可,不需要使用分號。

[root@centos7 ~]# cat script3.gawk {
text = "'s home directory is "print $1 text $6
}
[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腳本一樣使用美元符。

6 在處理數(shù)據(jù)前運行腳本

gawk還允許指定程序腳本何時運行。默認情況下,gawk會從輸入中讀取一行文本,然后針對該行的數(shù)據(jù)執(zhí)行程序腳本。有時可能會需要在處理數(shù)據(jù)前運行腳本,比如報告創(chuàng)建標題。BEGIN關(guān)鍵字就是用來做這個的。它會強制gawk在讀取數(shù)據(jù)前執(zhí)行BEGIN關(guān)鍵字后指定的程序腳本。

[root@centos7 ~]# cat data3.txt Line 1Line 2Line 3[root@centos7 ~]# gawk 'BEGIN{print "The data3 File contents:"}{print $0}' data3.txt The data3 File contents:Line 1Line 2Line 3

在gawk執(zhí)行了BEGIN腳本后,它會用第二段腳本來處理文件數(shù)據(jù)。這么做是要小心,兩段腳本仍然被認為是gawk命令行中的一個文本字符串。你需要相應的加上單引號。

7 在處理數(shù)據(jù)后運行腳本

與BEGIN關(guān)鍵字類似,END關(guān)鍵字允許你指定一個程序腳本,gawk會在讀完數(shù)據(jù)后執(zhí)行它。

[root@centos7 ~]# gawk '{print $0} END{print "End of file"}' data3.txt Line 1Line 2Line 3End of file

當gawk程序打印完文件內(nèi)容后,會執(zhí)行END腳本中的命令。這是在處理完所有正常數(shù)據(jù)后給報告添加頁腳的最佳方法。

gawk程序是Unix中原始awk程序的GNU版本。gawk程序讓流編輯器邁上了一個新的臺階,它提供了一種編程語言而不只是編輯器命令。在gawk編程語言中,可以完成下面的事情:
(1)定義變量來保存數(shù)據(jù);
(2)使用算數(shù)和字符串操作符來處理數(shù)據(jù);
(3)使用結(jié)構(gòu)化編程概念(比如if-then語句和循環(huán))來為數(shù)據(jù)處理增加處理邏輯;
(4)通過提取數(shù)據(jù)文件中的數(shù)據(jù)元素,將其重新排列或格式化,生成格式化報表;
gawk程序的報告生成能力通常用來從大文本文件中提取數(shù)據(jù)元素,并將它們格式化成可讀的報告。其中完美的例子是格式化日志文件。在日志文件中找出錯誤行會很難,gawk程序可以讓你從日志文件中過濾出需要的數(shù)據(jù)元素,然后你可以將其格式化,使得重要的數(shù)據(jù)易于閱讀。

1 gawk命令格式

gawk option program file
    選項:     描述
    -F fs           指定行中劃分數(shù)據(jù)字段的字段分隔符
    -f file         從指定的文件中讀取程序
    -v var=value        定義gawk程序中的一個變量及其默認值
    -mf N           指定要處理的數(shù)據(jù)文件中的最大字段數(shù)
    -mr N           指定數(shù)據(jù)文件中的最大數(shù)據(jù)行數(shù)
    -W  keyword     指定gawk的兼容模式或警告等級

命令行選項提供了一個簡單的途徑來定制gawk程序中的功能。
gawk的強大之處在于程序腳本,可以寫腳本來讀取文本行的數(shù)據(jù),然后處理并顯示數(shù)據(jù),創(chuàng)建任何類型的輸出報告。

2 從命令行讀取程序腳本

(1)gawk程序及腳本用一對花括號來定義。你必須將命令放到兩個花括號“{}”中。如果你錯誤的使用了圓括號來包含gawk腳本,就會出錯。
(2)由于gawk命令行假定腳本是單個文本字符串,你還必須將腳本放到單引號中。
例如:

        [root@centos7 ~]# gawk '{print "Hello World!"}'

運行這個命令,你可能會有些失望,因為什么都不會發(fā)生。原因在于沒有在命令行上指定文件名,所有g(shù)awk程序會從STDIN接受數(shù)據(jù)。在運行這個程序時,它會一直等待從STDIN輸入的文本。
如果你輸入一行文本并按下回車鍵,gawk會對這行文本運行一遍程序腳本。跟sed編輯器一樣,gawk程序會針對數(shù)據(jù)流中的每一行文本執(zhí)行程序。由于程序腳本被設(shè)為顯示一行固定的文本字符串,因此不管你在數(shù)據(jù)流中輸入什么文本,都會得到同樣的文本輸出。

[root@centos7 ~]# gawk '{print "Hello World!"}'Thie is a error testHello World!Hello World!Hello World!

要終止這個程序,你必須標明數(shù)據(jù)流已經(jīng)結(jié)束了。bash shell提供了一個組合鍵倆生成EOF(End –of-File)字符。Ctrl + D 組合鍵會字bash中產(chǎn)生一個EOF字符。這個組合鍵能夠終止該gawk程序并返回到命令行界面提示符下。

3 使用數(shù)據(jù)字段變量

gawk的主要特征之一是其處理文本文件中數(shù)據(jù)的能力。它會自動給一行的每個數(shù)據(jù)元素分配一個變量。默認情況下,gawk會將如下變量分配給它在文本中發(fā)現(xiàn)的數(shù)據(jù)字段:

$0  代表整個文本行
$1  代表文本行的第一個數(shù)據(jù)段
$n  代表文本行的第n個數(shù)據(jù)段

在文本行中,每個數(shù)據(jù)段都是通過字段分隔符劃分的。gawk在讀取一行文本時,會用預定義的字段分隔符劃分每個字段。gawk中默認的字段分隔符是任意的空白字符(例如空格或者制表符)。
例如,用-F指定字段分隔符。顯示系統(tǒng)密碼文件的第一個數(shù)據(jù)字段。由于/etc/passwd用冒號來分隔數(shù)據(jù)字段,因而可以將冒號指定為字段分隔符。

[root@centos7 ~]# gawk -F : '{print $1}' /etc/passwdroot
bin
daemon
adm
lp
syncshutdownhalt
mail
operator
[……]

4 在程序腳本中使用多個命令

gawk編程語言允許將多條命令組合成一個正常程序。要在命令行上的程序腳本中使用多條命令,只要在命令之間放個分號即可。
例如

[root@centos7 ~]# echo "My name is centos"|gawk '{$4="hahaha";print $0}'My name is hahaha

第一條命令會給$4賦值。第二條命令會打印整個數(shù)據(jù)字段。注意,gawk程序在輸出中已經(jīng)將原文本中的第四個數(shù)據(jù)字段替換了新值。

5 從文本中讀取程序

跟sed編輯器一樣,gawk編輯器允許將程序存儲到文件中,然后再在命令行中引用。

[root@centos7 ~]# cat script2.gawk {print $1 "'s' home directory is " $6}
[root@centos7 ~]# gawk -F: -f script2.gawk  /etc/passwdroot'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文件中的主目錄數(shù)據(jù)字段(字段變量$6),以及userID數(shù)據(jù)字段(字段變量$1)。
可以在程序文件中指定多條命令。要這么做的話,只有一天命令放一行即可,不需要使用分號。

[root@centos7 ~]# cat script3.gawk {
text = "'s home directory is "print $1 text $6
}
[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腳本一樣使用美元符。

6 在處理數(shù)據(jù)前運行腳本

gawk還允許指定程序腳本何時運行。默認情況下,gawk會從輸入中讀取一行文本,然后針對該行的數(shù)據(jù)執(zhí)行程序腳本。有時可能會需要在處理數(shù)據(jù)前運行腳本,比如報告創(chuàng)建標題。BEGIN關(guān)鍵字就是用來做這個的。它會強制gawk在讀取數(shù)據(jù)前執(zhí)行BEGIN關(guān)鍵字后指定的程序腳本。

[root@centos7 ~]# cat data3.txt Line 1Line 2Line 3[root@centos7 ~]# gawk 'BEGIN{print "The data3 File contents:"}{print $0}' data3.txt The data3 File contents:Line 1Line 2Line 3

在gawk執(zhí)行了BEGIN腳本后,它會用第二段腳本來處理文件數(shù)據(jù)。這么做是要小心,兩段腳本仍然被認為是gawk命令行中的一個文本字符串。你需要相應的加上單引號。

7 在處理數(shù)據(jù)后運行腳本

與BEGIN關(guān)鍵字類似,END關(guān)鍵字允許你指定一個程序腳本,gawk會在讀完數(shù)據(jù)后執(zhí)行它。

[root@centos7 ~]# gawk '{print $0} END{print "End of file"}' data3.txt Line 1Line 2Line 3End of file

當gawk程序打印完文件內(nèi)容后,會執(zhí)行END腳本中的命令。這是在處理完所有正常數(shù)據(jù)后給報告添加頁腳的最佳方法。

http://www.cnblogs.com/Sunzz/p/7232058.html