二。awk命令格式和選項
2.1 awk的語法有兩種形式
1.命令行模式
awk【-F字段分隔符】“命令”輸入文件
其中,commands是壹個真正的awk命令,而【-F域分隔符】是可選的。輸入文件是要處理的文件。
在awk中,在文件的每壹行中,由域分隔符分隔的每壹項稱為壹個域。通常,默認的域分隔符是壹個沒有命名為-F域分隔符的空格。
2.將所有awk命令插入到壹個單獨的文件中,然後調用:
awk-f awk-腳本文件輸入文件
其中-f選項加載awk-script-file中的awk腳本,輸入文件同上。
2.2命令選項
(1)-F fsor-field-separator fs:指定輸入文件的分隔符,fs為字符串或正則表達式,如-F:。
(2)-v var = value或-asignvar = value:分配壹個用戶定義的變量。
(3)-f腳本文件或-file腳本文件:從腳本文件中讀取awk命令。
(4)-mf nnn和-mr nnn:對nnn的值設置固有限制,-MF選項限制分配給nnn的最大塊數;-mr選項限制最大記錄數。這兩個函數是貝爾實驗室awk的擴展函數,在標準awk中不適用。
(5)-w compat或-compat,-w traditional或-traditional:在兼容模式下運行awk。因此gawk的行為與標準awk完全壹樣,所有awk擴展都被忽略。
(6)-w copy left或-copyleft、-w copyright或-copyright:打印簡短的版權信息。
(7)-w help或-help,-w usage或-usage:打印所有awk選項和每個選項的簡短描述。
(8)-w lintor-lint:打印無法移植到傳統unix平臺的結構的警告。
(9)-9)-W lint-old或- lint-old-old:打印關於無法移植到傳統unix平臺的結構的警告。
(10)-W POSIX:打開兼容模式。但是有以下限制,無法識別:/x,function關鍵字,func,轉義序列,當fs為空格時,以新行作為字段分隔符;運算符* *和* =不能替換and =;Fflush無效。
(11)-w re-interval或-re-inerval:允許使用區間正則表達式,參考(grep中的Posix字符類),如括號表達式【【:alpha:】】。
(12)-w源程序-文本或-源程序-文本:使用程序-文本作為源代碼,可以與-f命令混合使用。
(13)-w版本或-version:打印錯誤報告信息的版本。
三。使用方法
# awk“{模式+操作}”{文件名}
盡管操作可能很復雜,但語法總是這樣,其中模式表示AWK在數據中尋找的內容,而操作是在找到匹配內容時執行的壹系列命令。大括號({})不需要在程序中壹直出現,但它們用於根據特定模式對壹系列指令進行分組。模式是要表達的正則表達式,用斜線括起來。
awk語言最基本的功能是根據指定的規則從文件或字符串中瀏覽和提取信息。awk提取信息後,可以執行其他文本操作。壹個完整的awk腳本通常用於格式化文本文件中的信息。
通常,awk被視為文件的壹個單元。Awk接收文件的每壹行,然後執行相應的命令來處理文本。
四。方式和運作
Awk腳本由模式和操作組成:
模式{action},如$ awk“/root/”測試或$ awk“$ 3
兩者都是可選的。如果沒有模式,該操作將應用於所有記錄。如果沒有操作,輸出匹配所有記錄。默認情況下,每個輸入行都是壹條記錄,但用戶可以通過rs變量指定不同的分隔符來分隔它們。
4.1.mode
該模式可以是以下任何壹種:
(1)正則表達式:使用通配符的擴展集。
(2)關系表達式:可以用以下運算符表中的關系運算符進行運算,可以是character(3)字符串或數字的比較,如$ 2》;%1選擇第二個字段比第壹個字段長的行。
(4)模式匹配表達式:使用運算符~(match)和~!(不匹配)。
(5)模式:指定線條的範圍。語法不能包含開始和結束模式。
(6)開始:讓用戶指定在處理第壹個輸入記錄之前發生的動作。通常,全局變量可以在這裏設置。
(7)END:在讀取最後壹條輸入記錄後讓用戶采取行動。
4.2.操作
壹個操作由壹個或多個命令、函數和表達式組成,用換行符或分號分隔,並用大括號括起來。有四個主要部分:
(1)變量或數組賦值
②輸出命令
③內置功能
④控制流命令
動詞 (verb的縮寫)awk的環境變量
6.awk操作員
七。記錄和域
7.1.記錄
Awk將每壹行以換行符結尾的行都稱為記錄。
記錄分隔符:默認的輸入和輸出分隔符是回車符,它們存儲在內置變量Ors和RS中。
$0變量:指的是整個記錄。例如,$ awk“{ print $ 0 }”測試將輸出測試文件中的所有記錄。
變量NR:壹個計數器。每處理壹條記錄,NR的值就會增加1。
例如,$ awk“{ print NR,$0}”測試將輸出測試文件中的所有記錄,並在記錄前顯示記錄號。
7.2.領域
記錄中的每個單詞稱為“域”,默認情況下由空格或制表符分隔。Awk可以跟蹤域的數量並將該值保存在內置變量NF中。例如,$ awk“{ print $ 1,$3}”測試將打印測試文件中由空格分隔的第壹列和第三列(字段)。
7.3.域分隔符
內置變量FS保存輸入字段分隔符的值,默認值為space或tab。我們可以通過-F命令行選項修改FS的值。例如,$ awk-f:“{ print $ 1,$5}”測試將打印由冒號分隔的第壹列和第五列的內容。
您可以同時使用多個域分隔符,因此您應該將分隔符放在方括號中,例如$ awk-f‘【:/t】‘{ print $ 1,$ 3 }‘test,這意味著空格、冒號和制表符被用作分隔符。
默認情況下,輸出字段的分隔符是壹個空格,保存在OFS中。例如,$ awk-f之間的逗號:“{print $1,$5}”測試,$1和$5之間的值是OFS的值。
八。匹配運算符(~)
用於匹配記錄或域中的正則表達式。例如,$ awk‘$ 1 ~/root/‘test將在測試文件的第壹列顯示以root開頭的行。
九。比較表達
條件表達式1?表達2:表達3,
例如:
$ awk“{ max = { $ 1 & gt;$3} ?$1: $3:最大打印量}‘測試。如果第壹個字段大於第三個字段,則將$1分配給max,否則將$3分配給max。
$ awk‘$ 1+$ 2 & lt;100‘測試。如果第壹個和第二個字段的總和大於100,則打印這些行。
$ awk‘$ 1 & gt;5 & amp& amp$ 2 & lt“10”測試,如果第壹個字段大於5,第二個字段小於10,則打印這些行。
X.範圍模板
範圍模板匹配從第壹個模板第壹次出現到第二個模板第壹次出現的所有行。如果模板沒有出現,匹配到開頭或結尾。例如,$ awk“/root/,/mysql/”測試將顯示root第壹次出現和mysql第壹次出現之間的所有行。