awk命令詳解

2021-06-02 14:38:51 字數 3729 閱讀 3529

本文編輯整理自:

一、前言

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...