1. 什麼是awk
awk是unix/linux提供的樣式掃瞄與處理工具,非常擅長處理結構化資料和生成表單。與sed 和grep 很相似,但功能卻超過大於兩者,由於awk具備各種指令碼語言的特點,所以也可以把它看做一種指令碼語言。本文介紹了awk的使用方法。
2. awk程式設計模型
awk程式由三部分組成,分別為:初始化(處理輸入前做的準備,放在begin塊中),資料處理(處理輸入資料),收尾處理(處理輸入完成後要進行的處理,放到end塊中)。其中,在「資料處理」過程中,指令被寫成一系列模式/動作過程,模式是用於測試輸入行的規則,以確定是否將應用於這些輸入行。
3. awk呼叫方式
主要有三種呼叫方式,分別為:
(1) awk 命令列
你可以象使用普通unix 命令一樣使用awk,在命令列中你也可以使用awk 程式語言,,這種方法一般只用於解決簡單的問題。當然,你也可以在shell script 程式中引用awk 命令列甚至awk 程式指令碼。
(2) 使用-f 選項呼叫awk 程式
awk 允許將一段awk 程式寫入乙個文字檔案,然後在awk 命令列中用-f 選項呼叫並執行這段程式。
(3) 利用命令直譯器呼叫awk 程式
利用unix 支援的命令直譯器功能,我們可以將一段awk 程式寫入文字檔案,然後在它的第一行加上#!/bin/awk –f.
4. awk語法
與其它 unix 命令一樣,awk 擁有自己的語法:
awk [ -f re] [parameter...] ['prog'] [-f progfile][in_file...]
(1) -f re:允許awk 更改其欄位分隔符。
(2) parameter:該引數幫助為不同的變數賦值。
(3) 『prog』:awk 的程式語句段。這個語句段必須用單拓號:』和』括起,以防被shell 解釋。這個程式語句段的標準形式為:』pattern 』
其中pattern 引數可以是egrep 正規表示式中的任何乙個,它可以使用語法/re/再加上一些樣式匹配技巧構成。與sed 類似,你也可以使用」,」分開兩樣式以選擇某個範圍。action 引數總是被大括號包圍,它由一系列awk 語句組成,各語句之間用」;」分隔。awk 解釋它們,並在pattern 給定的樣式匹配的記錄上執行其操作。你可以省略pattern 和action 之一,但不能兩者同時省略,當省略pattern 時沒有樣式匹配,表示對所有行(記錄)均執行操作,省略action時執行預設的操作——在標準輸出上顯示。
(4) -f progfile:允許awk 呼叫並執行progfile 指定有程式檔案。progfile 是乙個文字檔案,它必須符合awk 的語法。
(5) in_file:awk的輸入檔案,awk 允許對多個輸入檔案進行處理。值得注意的是awk 不修改輸入檔案。如果未指定輸入檔案,awk 將接受標準輸入,並將結果顯示在標準輸出上。
5. awk指令碼編寫
5.1 awk的內建變數
awk中有兩類內建的變數,一類使用者可根據需要改變,主要有:fs:輸入資料的字段分割符,rs:輸入資料的記錄分隔符,ofs:輸輸出資料的字段分割符,ors:輸出資料的記錄分隔符;另一類是系統自動改變的,如:nf:當前記錄的字段個數,nr:當前記錄編號等。
舉例說明:
awk -f」:」 『』 /etc/passwd #列印passwd中的第1,3個字段
5.2 pattern/action模式
awk程式部分採用了pattern/action模式,即,針對匹配pattern的資料,使用action邏輯進行處理。
舉例說明:
/^$/ #判斷當前是不是空格
$5 ~ /ma/ #判斷第5個字段是不是含有「ma」
nf == 3
5.3 begin和 end
在 awk中兩個特別的表示式,begin和 end,這兩者都可用於 pattern中,提供 begin 和 end 的作用是給程式賦予初始狀態和在程式結束之後執行一些掃尾的工作。任何在 begin 之後列出的操作(在{}內)將在 awk 開始掃瞄輸入之前執行,而 end 之後列出的操作將在掃瞄完全部的輸入之後執行。因此,通常使用begin來初始化變數,使用end 來輸出最終結果。
例:累計銷售檔案xs 中的銷售金額(假設銷售金額在記錄的第三字段) :
$awk
>』begin
>
>end 』 sx
5.4 迴圈語句
awk中的迴圈語句與c很相似,包括do…while,for,continue/break,while等
5.5 條件語句
awk中的條件語句與c相似,但它有更好地支援。
舉例說明:
if(x ~ /[yy](es) ?/) print x #如果x符合pattern 「[yy](es) ?」,則列印出來
} #如果$0不包含「matchme」,則列印第1,3,4個字段
5.6 函式
(1) 數學函式
awk中包含豐富的數學函式,包括:cos(x),sin(x),log(x),….
(2) 字串函式
awk中包含豐富的字串函式,如:
length(x):求字串x的長度
index(t,s):返回字串s在字串t中的位置
match(s,r):正規表示式r在字串s中出現位置
…(3) 自定義函式
awk允許自定義函式,語法是:function name(parameter-list)
如:function insert(string, pos, ins)
呼叫方法:print insert($1, 4, 「xx」)
6. awk與shell混用
因為 awk 可以作為乙個 shell 命令使用, 因此 awk 能與 shell 批處理程式很好的融合在一起,這給實現 awk 與 shell 程式的混合程式設計提供了可能。實現混合程式設計的關鍵是 awk 與shell script之間的對話, 換言之, 就是awk與shell script之間的資訊交流:awk從shell script中獲取所需的資訊(通常是變數的值)、在 awk 中執行 shell 命令列、shell script 將命令執行的結果送給 awk處理以及 shell script讀取 awk的執行結果等等。
6.1. awk讀取shell script程式變數
在awk中我們可以通過「』$變數名』」的方式讀取sell scrpit程式中的變數。
例如:讀取shell scrpit程式中的變數name
下面給出兩種方式:
第一種比較常用的方式:(雙引號和單引號的意義需要明確)
#!/bin/sh
name=』john』
awk 『』 myfile
————————————————-
第二種方式:
#!/bin/sh
name=』john』
awk 『』 myname=$name myfile
不過這種方式中,awk自定義變數myname不能在begin中使用。
6.2. 將shell命令的執行結果送給awk處理
作為資訊傳送的一種方法,我們可以將一條shell命令的結果通過管道線(|)傳遞給awk處理:
例:示例awk處理shell命令的執行結果
$who -u | awk 『』
6.3. shell script程式讀awk的執行結果
shell中可以將awk執行結果賦值給shell變數。我們可以用變數名=`awk語句`的形式將awk執行的結果存放入乙個shell script變數。當然也可以用管道線的方法將awk執行結果傳遞給shell script程式處理。
例如:找出myfile中帶有fail字串的行並統計行數,最後列印出格式為:there are (行數) lines
#!/bin/sh
temp=`awk 『/fail/』 myfile |wc -l`
echo 「there are $temp lines
7. 參考資料
(1)
(3) 書籍《sed 與 awk》修訂第三版
awk使用總結
dong 1.什麼是awk awk是unix linux提供的樣式掃瞄與處理工具,非常擅長處理結構化資料和生成表單。與sed 和grep 很相似,但功能卻超過大於兩者,由於awk具備各種指令碼語言的特點,所以也可以把它看做一種指令碼語言。本文介紹了awk的使用方法。2.awk程式設計模型 awk程式...
awk 學習總結
1.過濾固定字元開頭的檔案並重命名 如檔名稱為 0001.jpg 0002.jpg 0003.jpg 需要修改為 1.jpg 2.jpg 3.jpg for i in ls do a echo i sed s 00 mv i a dev null 2 1 done 2.在檔名稱前加固定字首 如在檔名...
awk用法總結
awk 主要用於資料提取 執行awk,需要乙個告訴awk怎麼做的awk程式。awk是由一系列指令組成,每個指令是由乙個搜尋模式和乙個執行動作組成,多個指令之間用換行符分開 pattern n pattern 執行awk有兩種方式,1,awk程式很短,可以直接寫在執行awk的命令列中 2,awk程式比...