本文編輯整理自:
一、前言
awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk。awk語言的最基本功能是在檔案或字串中基於指定規則來分解抽取資訊,也可以基於指定的規則來輸出資料。完整的awk指令碼通常用來格式化文字檔案中的資訊。
二、基本語法
awk [opion] 'awk_script' input_file1 [input_file2 ...]
awk的常用選項option有:
①-f fs : 使用fs作為輸入記錄的字段分隔符,如果省略該選項,awk使用環境變數ifs的值
② -f filename : 從檔案filename中讀取awk_script
③ -v var=value : 為awk_script設定變數
awk有三種執行方式:
第一種,把awk的指令碼命令直接放在命令中。
第二種,把awk的所有的指令碼命令放在乙個指令碼檔案中,然後用-f選項來指定要執行的指令碼命令檔案。
第三種,將awk_script放入指令碼檔案並以
#!/bin/awk -f 作為首行,給予該指令碼可執行許可權,然後在shell下通過鍵入該指令碼的指令碼名呼叫之。
三、awk指令碼
awk指令碼可以由一條或多條
awk_cmd
組成,對於多個
awk_cmd
,乙個awk_cmd
完成後,應該另起一行,以便進行隔。
awk_cmd
由兩部分組成:
awk_pattern 。
另外,在
awk命令中直接使用
awk_script
時,awk_script
也可以被分成多行書寫,但必須確保整個
awk_script
被單引號
括起來。
awk命令的一般形式:
awk '
begin
awk_pattern1
............
awk_patternn
end' inputfile
其中 begin 和 end 是可選的。
在awk指令碼中可以使用awk本身內建變數,如下:
argc
命令列變元個數
argv
命令列變元陣列
filename
當前輸入檔名
fnr當前檔案中的記錄號
fs輸入域分隔符,預設為乙個空格
rs輸入記錄分隔符
nf當前記錄裡域個數
nr到目前為止記錄數
ofs輸出域分隔符
ors輸出記錄分隔符
awk指令碼的執行過程:
① 如果
begin 區塊存在,awk執行它指定的actions。
② awk從輸入檔案中讀取一行,稱為一條
輸入記錄。(如果輸入檔案省略,將從標準輸入讀取)
③ awk將讀入的記錄分割成欄位,將第1個字段放入變數$1中,第2個字段放入$2,以此類推。$0表示整條記錄。字段分隔符使用shell環境變數ifs或由引數指定。
④ 把當前輸入記錄依次與每乙個awk_cmd中awk_pattern比較,看是否匹配,如果相匹配,就執行對應的actions。如果不匹配,就跳過對應的actions,直到比較完所有的awk_cmd。
⑤ 當一條輸入記錄比較了所有的awk_cmd後,awk讀取輸入的下一行,繼續重複步驟③和④,這個過程一直持續,直到awk讀取到檔案尾。
⑥ 當awk讀完所有的輸入行後,如果存在
end,就執行相應的actions。
1)input_file可以是多於乙個檔案的檔案列表,awk將按順序處理列表中的每個檔案。
2)一條awk_cmd
的awk_pattern
可以省略,省略時不對輸入記錄進行匹配比較就執行相應的actions。一條awk_cmd的actions 也可以省略,省略時預設的動作為列印當前輸入記錄,即 。一條awk_cmd中的awk_pattern和actions
不能同時省略。
3) begin區塊
和end區塊
別位於awk_script的開頭和結尾。
awk_script
中只有end區塊
或者只有
begin區塊
是被允許的。如果awk_script中只有begin ,awk不會讀取input_file。
4)awk
把輸入檔案的資料讀入記憶體,然後操作記憶體中的輸入資料副本,
awk不會修改輸入檔案的內容。
5) awk
的總是輸出到標準輸出,如果想讓
awk輸出到檔案,可以使用重定向。
3.1.awk_pattern
awk_pattern
模式部分決定
actions
動作部分何時觸發及觸發
actions。
awk_pattern
可以是以下幾種型別:
1) 正規表示式用作
awk_pattern:/
regexp/
注意,正規表示式
regexp
必須被/
包起來
awk中正規表示式匹配操作中經常用到的字元:
\ ^ $ . | () * //
:通用的regexp元字元
+: 匹配其前的單個字元一次以上,是awk自有的元字元,不適用於grep或sed等
?: 匹配其前的單個字元1次或0次,是awk自有的元字元,不適用於grep或sed等
正規表示式》舉例:
awk '/*
\$0\.[0-9][0-9].*
/' input_file
比如,行內容為
$0.99. helllo
的行就可以和上面的正規表示式相配
2) 布林表示式用作
awk_pattern
,表示式成立時,觸發相應的actions執行。
① 表示式中可以使用
變數(如欄位變數$1,$2等)和/regexp/
② 布林表示式中的操作符:
關係操作符:
< > <= >= == !=
匹配操作符:
value
~/regexp/
如果value匹配/regexp/,則返回真
value
!~/regexp/
如果value不匹配/regexp/,則返回真
舉例:
awk '$2
>
10 ' input_file
awk '$3 ~/
^d/' input_file③&&
(與) 和
||(或) 可以連線兩個/regexp/或者布林表示式,構成
混合表示式。!
(非) 可以用於布林表示式或者/regexp/之前。
舉例:
awk '($1 < 10 ) && ($2 > 10) ' input_file
awk '/^d
/||/x$
/ ' input_file
④ 其它表示式用作awk_script,如賦值表示式等舉例:
awk '(tot+=$6); end' input_file
// 分號不能省略
awk 'tot+=$6 end' input_file
// 與上面等效
當使用賦值表示式時,表示如果賦值後的變數是數字的話,如果為非0,就匹配,否則不匹配;如果為字串的話,非空就為匹配,否則不匹配。
awk命令詳解
參考 size large color green b shell獲取某個時間段的nginx日誌內容 b color size 針對以上內容,要查詢出2018 03 29 14 03至2018 03 29 14 05之間的內容,可以使用awk命令來處理 cat time1.log egrep 201...
awk命令詳解
awk是乙個強大的文字分析工具,是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。awk其名稱得自于它的創始人alfred aho peter weinberger和brian kernighan姓氏的首字母。實際上 awk 的確擁有自己的語言 awk程式語言,三位建立...
Linux之awk命令詳解
3.awk的執行過程 1 awk script的組成 awk script可以由一條或多條awk cmd組成,兩條awk cmd之間一般以newline分隔 awk cmd由兩部分組成 awk pattern awk script可以被分成多行書寫,必須確保整個awk script被單引號括起來。2...