歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> AWK使用方法總結

AWK使用方法總結

日期:2017/2/28 14:25:55   编辑:Linux教程

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

awk命令的一般格式為

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

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

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

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

AWK簡介及使用實例 http://www.linuxidc.com/Linux/2013-12/93519.htm

AWK 簡介和例子 http://www.linuxidc.com/Linux/2012-12/75441.htm

Shell腳本之AWK文本編輯器語法 http://www.linuxidc.com/Linux/2013-11/92787.htm

正則表達式中AWK的學習和使用 http://www.linuxidc.com/Linux/2013-10/91892.htm

文本數據處理之AWK 圖解 http://www.linuxidc.com/Linux/2013-09/89589.htm

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

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

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對應最後一個分段。如果記錄號大於總分段數,則返回空字符,但可以對其進行賦值操作後打印。注意,不帶$的NF對應一個內置變量,它的值是當前記錄的分段數量。例如:

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

awk ‘$1 ~ /pattern/ {print $!, $NF} ’ datafile上例中打印datafile中所有行中首個分段包含pattern的行的第一個分段和最後一個分段。~是匹配運算符,它檢驗給定字符串($1)是否匹配之後的正則表達式。
除了默認的分割符,awk允許指定字符或正則表達式作為分割符。分割符不出現在分段中。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

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-11/109324p2.htm

Copyright © Linux教程網 All Rights Reserved