標籤:blog 使用 檔案 ar 代碼 html log new sp
【著作權聲明:轉載請保留出處:blog.csdn.net/gentleliu。Mail:shallnew at 163 dot com】
上一節說到了grep命令,grep命令主要用在擷取符合規則的行資訊。本節要講的awk在對某檔案或字串中擷取指定文本域有較強大的功能。
a w k語言的最準系統是在檔案或字串中基於指定規則瀏覽和抽取資訊。 a w k抽取資訊後,才能進行其他文本操作。完整的 a w k指令碼通常用來格式化文字檔中的資訊。
在命令列上調用awk命令式最常用的使用awk的方式:
awk [-F separator] ‘cmd’ filename
cmd是真正的awk命令,[-F 域分隔字元]是可選的,因為 a w k使用空格作為預設的域分隔字元,因此如果要瀏覽域間有空格的文本,不必指定這個選項,但如果要瀏覽諸如 p a s s w d檔案,此檔案各域以冒號作為分隔字元,則必須指明 - F選項,如:
awk -F: ‘{cmd}’ /etc/passwd
awk在調用時,會每次讀一條記錄或一行,並使用指定的分割域分割指定域(未設定分割域時預設為空白格),然後標記為 $ 1,$ 2 . . . $ n,使用這些域標識將更容易對域進行進一步處理。 然後執行awk的命令部分操作,然後awk再開始讀入下一行內容,直到讀完整個檔案。
awk命令動作在大括弧 { }內指明。動作大多數用來列印,但是還有些更長的代碼諸如 if和迴圈(looping)語句及迴圈退出結構。
再講樣本之前先構造一個檔案(來自/etc/group檔案的修改),如下:
# cat group_file1wireshark x 987usbmon x 986jackuser x 985vboxusers x 984 allenaln x 1001#
第一個樣本:
# awk '{print}' group_file1wireshark x 987usbmon x 986jackuser x 985vboxusers x 984 allenaln x 1001#
該命令和cat 命令效果一樣,都是直接把檔案內容直接輸出。該awk的命令部分為print,執行awk時,依次對每一行執行print命令,他會把檔案每一行內容都列印出來。此處也可以有其他代碼,也可以和輸入進來的行無關。比如執行:
# awk '{print "hello awk!"}' group_file1hello awk!hello awk!hello awk!hello awk!hello awk!
有多少行檔案就會答應多少行hello awk!
awk 非常善於處理分成多個邏輯欄位的文本,而且讓您可以毫不費力地引用 awk 指令碼中每個獨立的欄位。對上面檔案,我們可以提取每一行的第一列和第三列內容(未指定-F時,預設為空白格),如下:
# awk '{print $1 $3}' group_file1wireshark987usbmon986jackuser985vboxusers984aln1001
輸出結果黏在一起了,我們可以加入一些字元分割它:
# awk '{print "group:"$1 "\tid:"$3}' group_file1 group:wireshark id:987group:usbmon id:986group:jackuser id:985group:vboxusers id:984group:aln id:1001
在{}裡面,及時$1之間$3有空格,也不會列印出空格,需要我們自己加入字串來輸出分割列印,也可以加入一個逗號,這樣輸出時會有一個空格分割。
這樣是不是好看多了,有沒有一種awk很牛B的感覺,不著急,才剛剛開始。
像其他shell命令一樣,awk命令也可以放在指令檔中。通過執行指令檔來執行awk命令。指令碼內容以及執行結果如下:
# cat 1_awk.sh#!/bin/shawk '{print "name:"$1 "\tid:"$3}' group_file1# ./1_awk.shname:wireshark id:987name:usbmon id:986name:jackuser id:985name:vboxusers id:984name:aln id:1001
通常,對於每個輸入行,awk 都會執行每個指令碼代碼塊一次。然而,在許多編程情況中,可能需要在 awk 開始處理輸入檔案中的文本之前執行初始化代碼。對於這種情況,awk 允許您定義一個 BEGIN 塊。 awk 在開始處理輸入檔案之前會執行 BEGIN 塊,因此它是初始化 FS(欄位分隔符號)變數、列印頁首或初始化其它在程式中以後會引用的全域變數的極佳位置。
awk 還提供了另一個特殊塊,叫作 END 塊。awk 在處理了輸入檔案中的所有行之後執行這個塊。通常,END 塊用於執行最終計算或列印應該出現在輸出資料流結尾的摘要資訊。
修改一下上面的例子,加入BEGIN 和END 塊:
#!/bin/shawk 'BEGIN { print " Name\tID\n==========================="}{ print "name:"$1 "\tid:"$3}END { print "=============END============="}' group_file1
對於不是以空格分割的行,可以使用-F設定分隔字元號,比如下面檔案:
# cat group_file2wireshark:x:987:usbmon:x:986:jackuser:x:985:vboxusers:x:984:allenaln:x:1001:# awk -F: '{print $1, $3}' group_file2wireshark 987usbmon 986jackuser 985vboxusers 984aln 1001
在後面我們有另外一種方法設定分割符號,就是設定FS變數。
shell文本過濾編程(二):awk之基礎