概述
awk 是一種編程語言,她是由AT&T 貝爾實驗室的Alfred Aho, Peter Weinberger 和Brian Kernighan開發的,Brian Kernighan。目前仍在維護及增強awk。awk的語法與C類似。
調用
1.awk ‘pattern-action statements’ input_file_list
2.將awk命令插入一個文件,並使awk程序可以執行,然後用awk命令解釋器作為腳本首行。
3.將所有awk命令插入一個單獨文件
awk -f awk-script-file inputfile
模式和動作
一個awk 程序是由一系列的"模式-動作"語句構成的:
pattern {action}
pattern {action}
pattern {action}
……
awk 程序為每個輸入行依次地進行每一個"模式"的匹配尋找,對每一個匹配上的模式執行相應的"動作",接著讀取下一行並再次開始匹配,直到所有的輸入都處理完畢。
在一條語句中可以省略"模式"或者"動作",缺省的模式為匹配所有行,缺省的動作為輸出當前行:print $0。無論何時,動作都必須用花括號引起來。
awk 從輸入中一次讀取一行(一條記錄),缺省的行分割符(記錄分割符)為\n。
然後awk 將記錄分割為一個個的字段,缺省的字段分割符為“Blank”(空白)。一行中的第一個字段稱為$1,第二個字段稱為$2,. . . ,整個記錄稱為$0。
打印
一個動作可以沒有模式,在這種情況下動作在所有行上執行。最簡單的動作是打印某些或所有的記錄;這可以通過 awk 命令 print 來完成。awk 程序{ print }打印每個記錄,也就是把輸入完好的復制到輸出。更有用的是打印來自每個記錄的一個字段或某些字段。例如
awk ‘{print $2, $1}’ filename
按逆序打印前兩個字段。在 print 語句中用逗號分隔的項,在輸出的時候會用當前輸出字段分隔符分隔開。沒有用逗號分隔的項會串聯起來,所以
CODEawk ‘{ print $1 $2 }’ filename
把第一個和第二個字段合在一起。
可以使用預定義的變量 NF 和 NR;例如
CODEawk ‘{ print NR, NF, $0 }’ filename
打印出前導了記錄數和字段數的每個記錄。
輸出可以被重定向到多個文件中
CODEawk ‘{ print $1 >"foo1"; print $2 >"foo2" }’ filename
寫第一個字段 $1 到文件 foo1 中,寫第二個字段到文件 foo2 中。還可以使用 >> 符號:
CODEawk ‘{ print $1 >>"foo" }’ filename
添加輸出到文件 foo。(在每種情況下,輸出文件都在必要時建立)。
文件名可以是一個變量或字段,同常量一樣;例如
CODEawk ‘{ print $1 >$2 }’ filename
使用字段 2 的內容作為文件名字。
自然的,有對輸出文件數目的限制,目前是 10 個。