shell文本過濾編程(二):awk之基礎

來源:互聯網
上載者:User

標籤: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之基礎

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.