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
更多詳情見請繼續閱讀下一頁的精彩內容: