Linux awk命令詳解

2021-06-04 21:46:53 字數 4715 閱讀 2462

3. awk的執行過程

1) awk_script的組成:

① awk_script可以由一條或多條awk_cmd組成,兩條awk_cmd之間一般以newline分隔

② awk_cmd由兩部分組成: awk_pattern

③ awk_script可以被分成多行書寫,必須確保整個awk_script被單引號括起來。

2) awk命令的一般形式:

awk ' begin

awk_pattern1

............

awk_patternn

end

' inputfile

其中 begin 和 end 是可選的。

3) 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。

4) iput_file可以是多於乙個檔案的檔案列表,awk將按順序處理列表中的每個檔案。

5) 一條awk_cmd的awk_pattern可以省略,省略時不對輸入記錄進行匹配比較就執行相應的actions。一條awk_cmd的actions 也可以省略,省略時預設的動作為列印當前輸入記錄(print $0) 。一條awk_cmd中的awk_pattern和actions不能同時省略。

6) begin區塊和end區塊別位於awk_script的開頭和結尾。awk_script中只有end區塊或者只有begin區塊是被允許的。如果awk_script中只有begin ,awk不會讀取input_file。

7) awk把輸入檔案的資料讀入記憶體,然後操作記憶體中的輸入資料副本,awk不會修改輸入檔案的內容。

8) awk的總是輸出到標準輸出,如果想讓awk輸出到檔案,可以使用重定向。

4.awk_pattern

awk_pattern模式部分決定actions動作部分何時觸發及觸發actions。awk_pattern可以是以下幾種型別:

1) 正規表示式用作awk_pattern: /regexp/

① awk中正規表示式匹配操作中經常用到的字元:

\ ^ $ . | () * // 通用的regexp元字元

+ : 匹配其前的單個字元一次以上,是awk自有的元字元,不適用於grep或sed等

? : 匹配其前的單個字元1次或0次,是awk自有的元字元,不適用於grep或sed等

② 舉例:

awk '/ *\$0\.[0-9][0-9].*/' input_file

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,如賦值表示式等

eg: awk '(tot+=$6); end' input_file // 分號不能省略

awk 'tot+=$6 end' input_file // 與上面等效

awk 用法例舉:

變數名 含義

argc 命令列變元個數

argv 命令列變元陣列

filename 當前輸入檔名

fnr 當前檔案中的記錄號

fs 輸入域分隔符,預設為乙個空格

rs 輸入記錄分隔符

nf 當前記錄裡域個數

nr 到目前為止記錄數

ofs 輸出域分隔符

ors 輸出記錄分隔符

1、awk '/101/' file 顯示檔案file中包含101的匹配行。

awk '/101/,/105/' file

awk '$1 == 5' file

awk '$1 == "ct"' file 注意必須帶雙引號

awk '$1 * $2 >100 ' file

awk '$2 >5 && $2<=15' file

2、awk '' file 顯示檔案file的當前記錄號、域數和每一行的第乙個和最後乙個域。

awk '/101/ ' file 顯示檔案file的匹配行的第二個域加10。

awk '/101/ ' file

awk '/101/ ' file 顯示檔案file的匹配行的第

一、二個域,但顯示時域中間沒有分隔符。

3、df | awk '$4>1000000 ' 通過管道符獲得輸入,如:顯示第4個域滿足條件的行。

4、awk -f "|" '' file 按照新的分隔符「|」進行操作。

awk 'begin

' file 通過設定輸入分隔符(fs="[: \t|]")修改輸入分隔符。

sep="|"

awk -f $sep '' file 按照環境變數sep的值做為分隔符。

awk -f '[ :\t|]' '' file 按照正規表示式的值做為分隔符,這裡代表空格、:、tab、|同時做為分隔符。

awk -f '' '' file 按照正規表示式的值做為分隔符,這裡代表[、]

5、awk -f awkfile file 通過檔案awkfile的內容依次進行控制。

cat awkfile

/101/ --遇到匹配行以後列印 ' hello! '.\047代表單引號。

--因為沒有模式控制,列印每一行的前兩個域。

6、awk '$1 ~ /101/ ' file 顯示檔案中第乙個域匹配101的行(記錄)。

7、awk 'begin

' file 通過設定輸出分隔符(ofs="%")修改輸出格式。

8、awk 'begin begin 表示在處理任意行之前進行的操作。

' file 取得檔案第乙個域的最大值。

(表示式1?表示式2:表示式3 相當於:

if (表示式1)

表示式2

else

表示式3

awk '' file

9、awk '$1 * $2 >100 ' file 顯示檔案中第乙個域匹配101的行(記錄)。

10、awk '' file 找到匹配行後先將第3個域替換後再顯示該行(記錄)。

awk '' file 將第7域被3除,並將餘數賦給第7域再列印。

11、awk '/tom/ ' file 找到匹配行後為變數wage賦值並列印該變數。

12、awk '/tom/

end ' file end表示在所有輸入行處理完後進行處理。

13、awk 'gsub(/\$/,"");gsub(/,/,""); cost+=$4;

end ' file gsub函式用空串替換$和,再將結果輸出到filename中。

1 2 3 $1,200.00

1 2 3 $2,300.00

1 2 3 $4,000.00

awk '

end "' file

通過if和else if完成條件語句

awk '

end "' file

通過exit在某條件時退出,但是仍執行end操作。

awk '

end "' file

通過next在某條件時跳過該行,對下一行執行操作。

14、awk '' file1 file2 file3>fileall 把file1、file2、file3的檔案內容全部寫到fileall中,格式為

列印檔案並前置檔名。

15、awk ' $1!=previous

' fileall 把合併後的檔案重新分拆為3個檔案。並與原檔案一致。

16、awk 'begin ' 通過管道把date的執行結果送給getline,並賦給變數d,然後列印。

17、awk 'begin '

通過getline命令互動輸入name,並顯示出來。

awk 'begin }'

列印/etc/passwd檔案中使用者名稱包含050x_的使用者名稱。

18、awk '}}

}'19、在awk中呼叫系統變數必須用單引號,如果是雙引號,則表示字串

flag=abcd

awk '' 結果為abcd

awk '' 結果為$flag

linux awk命令詳解

awk 儘管操作可能會很複雜,但語法總是這樣,其中 pattern 表示 awk 在資料中查詢的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號 不需要在程式中始終出現,但它們用於根據特定的模式對一系列指令進行分組。pattern就是要表示的正規表示式,用斜槓括起來。awk 語言...

linux awk命令詳解

awk是乙個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。awk有3個不同版本 awk nawk和gawk,未作特別說明,一般指gawk,gawk...

Linux awk命令詳解

awk用於格式化報文或者從檔案中抽取資料報 1.awk gefforey.txt tee gefforey.doc 該命令將在螢幕輸出gefforey.txt檔案內容並將其內容複製到gefforey.doc檔案中 2.awk f gefforey.log 該命令以 為單位讀取gefforey.log...