gawk程序
? ? 雖然sed編輯器是非常方便自動修改文本文件的工具,但其也有自身的限制。通常你需要一個用來處理文件中的數據的更高級工具,他能提供一個類編程環境來修改和重新組織文件中的數據,這正是gawk能夠做到的。
? ? 說明:在所有發行版中都沒有默認安裝gawk程序。如果你所用的linux發行版中沒有包含gawk,請參考第9章中的內容來安裝gawk包。
? ??gawk程序是unix中的原始程序的GNU版本。gawk程序讓流編輯邁上了一個新的臺階,它提供了一種編程語言而不只是編輯器命令。在gawk編程語言中,你可以做下面的事情:
定義變量來保存數據:
定義變量來保存數據;
使用算術和字符串操作符來處理數據;
使用結構化變成概念(比如if-then語句和循環)來為數據處理增加處理邏輯;
通過提取數據文件中的數據元素,將其重新排列或格式化,生成格式化報告。
? ?gawk程序的報告生成能力通常用來從大文本文件中提取數據元素,他將格式化成可讀的報告。其中最完美的例子時格式化日志文件。在日志文件中找出錯誤行會很難,gawk程序可以讓你從日志文件中過濾出需要的數據元素,然后你可以將其格式化,時的重要的數據更易于閱讀。
? ?1. gawk命令格式
? ? gawk程序的基本格式如下:
? ? gawk options program file?
? ?表19-2 顯示了gawk程序可用選項。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 表19-2 gawk選項
選項? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?描述
-F fs? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 指定行中劃分數據字段的字段分隔符
-f file? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 從指定的文件中讀取程序
-v var=value? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?定義gawk程序中的一個變量及默認值
-mf? N? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?指定要處理的數據文件中的最大字段數
-mr N? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 指定數據文件中的最大數據行數
-w keyword? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?指定gawk的兼容模式或者警告等級
命令行選項提供了一個簡單的途徑來定制gawk程序的功能。我們會在探索gawk進一步了解這些選項。
? ?gawk的強大之處在于程序腳本。可以寫腳本來讀取文本行的數據,然后處理并顯示數據,創建任何類型的輸出報告。
2 從命令行讀取程序腳本
? ?gawk程序腳本用一對花括號來定義。你必須將腳本命令放到兩個花括號({})中。如果你錯誤地使用了圓括號來包含gawk腳本,就會得到類似下面的錯誤提示。
$ gawk '(print "Hello world!")'
gawk: cmd. line:1: (print "Hello world!")
gawk: cmd. line:1: ?^ syntax error
gawk: cmd. line:2: (print "Hello world!")
gawk: cmd. line:2: ? ? ? ? ? ? ? ? ? ? ? ^ unexpected newline or end of string
由于gawk命令行假定程序是單個文本字符串,你還必須將腳本放進單引號中。下面的例子時在命令行中指定了一個簡單的gawk程序腳本:
gawk '{print "Hello world!"}'
這個程序腳本定義了一個命令:print命令。這個命令名副其實:它會將文本打印到STDOUT。如果嘗試運行這個命令,你可能會有些失望,因為什么也不會發生。原因在于沒有任何在命令行指定的文件名,所以gawk程序會從STDIN接收數據。在運行這個程序時,它會一直等待從STDIN輸入的文本。
? ? 如果你輸入一行文本并按下回車鍵,gawk會對這行文本運行一遍程序腳本。跟sed編輯器一樣,gawk程序會針對數據流中的每行文本執行程序腳本。由于程序腳本被設為顯示一行固定的文本字符串,因此不管你在數據流中輸入什么文本,都會得到同樣的文本輸出。
gawk '{print "Hello World!"}'
This is a test
Hello world
hello
Hello world
This is a another test
Hello world
要終止這個gawk程序,你必須表名數據流結束了。bash shell提供了一個組合鍵來生成EOF(End-of-line)字符。 Ctrl+D組合鍵會在bash中產生一個EOF字符。這個組合鍵能夠終止該gawk程序并返回到命令行界面提示符下。
3 使用數據字段變量
gawk的主要特性之一是其處理文本文件中數據的能力。它會自動給一行的每個數據元素分配一個變量。默認情況下,gawk會將如下變量分配給他在文本行中發現的數據字段。
$0代表整個文本行
$1代表文本行中的第一個數據字段。
$2代表文本行中的第二個數據字段
$N代表文本行中的第N個數據字段
? ?在文本行中,沒個數據字段都是通過字段分隔符劃分的。gawk在讀取一行文本時,會用預定義的字段分隔符劃分沒個數據字段。gawk中默認吧的字段分隔符是任意的空白字符(例如空格或者制表符)
在下面例子中,gawk程序讀取文本文件,只顯示第一個數據字段的值。
cat data2.txt
gawk '{print $1}' data2.txt
One
Two
Three
該程序用$1字段變量來僅顯示每行文本的第1個數據字段。
如果你要讀取采用了其他字段分隔符的文件,可以用-F選項指定。
$gawk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
postfix
sshd
chrony
tcpdump
mysql
dockerroot
這個簡短的程序顯示了系統中密碼文件中的第一個數據字段。由于/ect/passwd文件用冒號來分割數據字段,因而如果要劃分每個數據元素,則必須在gawk選項中將冒號指定為字段分隔符。
4. 在程序腳本中使用多個命令
? ? 如果一種編程語言只能執行一條命令,那么它不會有太大可用性。gawk編程語言允許你將多條命令組合成一個正常的程序。要在命令行的程序腳本中使用多條命令,只要在命令之間放個分號即可。
echo "My name is Rich" ?| gawk '{$4="Chritine"; print $0}'
My name is Chritine
? ? ?第一條命令會給字段變量$4賦值。第二條命令會打印整個數據字段。注意,gawk程序在輸出中已經將原文本中的第四個數據字段替換成了新值。
? ?也可以用次提示符一行一行地輸入程序腳本命令。
?gawk '{
> $4="Chritine"
> print $0}'
My name is Rich
My name is Chritine
?
在你使用了表示起始的單引號后,bash shell 會使用次提示符來提示你輸入更多數據。你可以每次在每行加一條命令,直到輸入結尾的單引號。因為沒有在命令行中指定文件名,gawk程序會從STDIN中獲得數據。當運行這個程序結束的時候,它會等著讀取來自STDIN的文本,要退出程序,只需要按下CTRL+D組合鍵來表名數據結束。
5. 從文件中讀取程序
跟sed編輯器一樣,gawk編輯器允許將程序存儲到文件中,然后再在命令行中引用。
cat script2.gawk
{print $1 "'s home directory is " $6}
?
?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
?
script2.gawk程序腳本會再次使用print命令打印/etc/passwd文件的主目錄數據字段(字段變量$6),以及userid數據字段(字段變量$1)。
可以在程序文件中指定多條命令。要這么做的話,只要一條命令放一行即可,不需要使用分號。
cat script3.gawk
{
text = "'s home directory is "
print $1 text $6
}
?
awk -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
halt's home directory is /sbin
mail's home directory is /var/spool/mail
? ?script3.gawk程序腳本定義了一個變量來保存print命令中用到的文本字符串。注意,gawk程序在引用變量值并未像shell腳本一樣使用美元符。
6. 在處理數據前運行腳本
? gawk還允許指定程序腳本何時運行。默認情況下,gawk會從輸入中讀取一行文本,然后針對改行的數據執行程序腳本。有時可能需要在處理數據前運行腳本,比如為報告創建標題。BEGIN關鍵字就是用來做這個的。它會強制gawk在讀取數據前執行BEGIN關鍵字后制定的程序腳本。
?gawk 'BEGIN {print "Hello World"}'
Hello World
這次print命令會在讀取數據前顯示腳本。但它顯示了文本后,它會快速推出,不等待任何數據。如果想使用正常的程序腳本中處理數據,必須用另一個腳本區域來定義程序。
?
?
?
?
?
總結
- 上一篇: win10 tensorflow MTC
- 下一篇: ARP断网攻击(详细教程)