AWK使用方法總結

來源:互聯網
上載者:User

AWK使用方法總結

1. awk最基本的功能是在輸入檔案中按行匹配指定的字串格式,如果匹配則將當前行複製到緩衝區進行進一步處理,但並不改變輸入檔案本身。awk匹配每一行(稱為Record)後,使用預設或指定的分割符自動將其分割為若干段(稱為Field),每一段可使用$number進行引用和訪問。其中段號0對應整個Record的內容。處理完成每一行後繼續讀入下一行進行處理。

awk命令的一般格式為

awk ‘/pattern/ {action}
 /pattern1/{action1}’  datafile1 datafile2

awk可以同時指定多個匹配條件和處理動作(規則),每條規則之間可以另起新行分割,只要將它們包含在同一單引號裡面即可。awk可以同時處理多個檔案對象。

如果省略{action},則awk預設列印所有匹配pattern的行。如果想要指定不作任何事情,怎可省略action的同時,只保留{}。

--------------------------------------分割線 --------------------------------------

AWK簡介及使用執行個體

AWK 簡介和例子

Shell指令碼之AWK文字編輯器文法

Regex中AWK的學習和使用

文本資料處理之AWK 圖解

如何在Linux中使用awk命令

--------------------------------------分割線 --------------------------------------

2. 有三種方法運行awk程式。

awk‘program’ datafile1 datafile2 …

這裡的program即pattern和action的組合,方式如前述。

awk–f program-file datafile1 datafile2 …

適用於程式較為複雜的情形。將/pattern/{action}組合放入program-file(不需要加單引號)後即可調用。為了使程式檔案一目瞭然,可使用尾碼名.awk。

將awk程式寫為指令檔後執行。

在指令檔行首加上 #!/bin/awk –f,然後BEGIN{}塊指定主程式執行的先決條件,中間是主程式,最後是END{}塊指定結束操作。運行時,按指令碼方式運行,並在後面指定輸入檔案。

需要注意的是,awk指令碼和shell指令碼中執行awk語句是不同的,前者使用awk程式的文法規則;後者只是將前兩種用法寫入檔案執行,遵從shell指令碼的文法規則。

3.讀入檔案時,除了使用預設的方式按行讀入Record,也可以指定其它的Record Separator。

awk ‘BEGIN {RS = “/”}; {print $0}’ datafile

使用awk內建變數RS指定新的Record分割符為/。因為awk列印時在每一條Record後重起新行,這樣通過指定新的分割符,就為datafile添加了新的換行。特別地,若指定RS為空白字元,則以空行為分割符。awk利用內建變數FNR追蹤當前讀入的行號(記錄號)。每次讀入新檔案時,FNR將自動置為0。另外一個變數NR記錄當前awk命令一共讀入了的行數(記錄數),該變數從0開始,但即使讀入新檔案也不會重新置0。如果在主程式中重新設定了RS,則只會影響設定後讀入的內容。

4.對於讀入的每一行(記錄),awk預設以(一個或多個)空格/定位字元為分段符將其劃分為若干段(Field),每一段可使用$number進行引用和訪問,其中number可以是可計算數值的變數或運算式。$0對應整條記錄,$NF對應最後一個分段。如果記錄號大於總分段數,則返回Null 字元,但可以對其進行賦值操作後列印。注意,不帶$的NF對應一個內建變數,它的值是目前記錄的分段數量。例如:

awk ‘$1 ~ /pattern/ {print $!, $NF} ’ datafile 

awk ‘$1 ~ /pattern/ {print $!, $NF} ’ datafile上例中列印datafile中所有行中首個分段包含pattern的行的第一個分段和最後一個分段。~是匹配運算子,它檢驗給定字串($1)是否匹配之後的Regex。
除了預設的分割符,awk允許指定字元或Regex作為分割符。分割符不出現在分段中。awk使用內建變數FS指定段分割符。

awk ‘BEGIN {FS = “:”}; {print $0}’ datafile使用命令列指定分割符時,可使用參數–F。


awk –F, ‘/pattern/{action}’ datafile上例指定“,”為段分隔字元。


5. 使用print列印多個分段時,預設以空白作為間隔符,但也可以使用內建變數OFS(output fieldseparator)顯式指定其它間隔符。類似的多個記錄之間也可以指定預設的分行符號之外的其它字串。

awk  ‘BEGIN {OFS = “;”; ORS=“\n\n”; OFMT = “%d” }
            {print $1, $2}’ datafile除了OFS,本例中ORS是記錄之間的間隔符。

OFMT則是處理數字時的列印格式。但實際上,我們通常用printf來格式化列印內容。它可以為每一個分段指定寬度,指定數位列印格式(基數、指數形式等等)。用法如下:

awk  ‘{print format item1, item2…}’ 

awk  ‘{print format item1, item2…}’和print不同,printf不會在列印完一條記錄後自動添加換行,並且OFS和ORS將失去其作用。format的指定方式和C語言中printf函數的format用法相同。

awk  ‘{printf  “%-10s  %s\n”,  $1, $2}’    datafile 

awk  ‘{printf  “%-10s  %s\n”,  $1, $2}’    datafile本例中,將分段1列印為最小寬度為10個字元的字串,若不夠則在左邊補足空白符(不帶-時在右邊補足空白符)。然後空格後直接列印分段2。最後插入分行符號後繼續處理下一條記錄。
另外,還可以利用 >, >>和|操作符重新導向print及printf的輸出。例如:

awk ‘{ print $1 > “output_file_name”
printf format $2 | “sort –r >> output_file_name_1”}’ datafile

更多詳情見請繼續閱讀下一頁的精彩內容:  

  • 1
  • 2
  • 下一頁

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.