它會依次讀取檔案的每一行内容, 然後對其進行處理,awk 指令預設從 stdio 标準輸入擷取檔案内容, awk 使用一對單引号來表示 一些可執行的腳本代碼,在可執行腳本代碼裡面,使用一對花括号來表示一段可執行代碼塊,可以同時存在多個代碼塊。 awk 的每個花括号内同時又可以有多個指令,每一個指令用分号分隔,awk 其實就是一個腳本程式設計語言。
<code>options</code> 這個表示一些可選的參數選項
<code>program</code> 這個表示 awk 的可執行腳本代碼,這個是必須要有的。
<code>file</code> 這個表示 awk 需要處理的檔案,注意是純文字檔案。
先來一個 awk 的使用例子熱熱身
awk 指令的可執行腳本代碼使用單引号括起來,緊接着裡面是一對花括号,然後花括号裡面就是一些可執行的腳本代碼段。
當 awk 每讀取一行之後,它會依次執行雙引号裡面的每個腳本代碼段。
在上面這個例子中, <code>$0</code> 表示目前行。當你執行了上面的指令之後,它會依次将 /etc/passwd 檔案的每一行内容列印輸出。
awk 預設的分割符為空格和制表符,我們可以使用 -F 參數來指定分隔符
上面的指令将 /etc/passwd 檔案中的每一行用冒号 : 分割成多個字段,然後用 print 将第 1 列字段的内容列印輸出
如何在 awk 中同時指定多個分隔符
比如現在有這樣一個檔案 some.log 檔案内容如下:
現在我們想将上面的 some.log 檔案中按照 "水果名稱(重量)年份" 來進行分割:
在 <code>-F</code> 參數中使用一對方括号來指定多個分隔符,awk 處理 some.log 檔案時就會使用 "(" 和 ")" 來對檔案的每一行進行分割。
awk 内置變量的使用
比如我們有這麼一個文本檔案 fruit.txt 内容如下,我将用它來向你示範如何使用 awk 指令工具:
我們來瞧一瞧下面這些例子:
多一個新檔案叫 company.txt 内容如下:
用 fruit.txt 和 company.txt 兩個檔案來向你示範 awk 同時處理多個檔案的時候有什麼效果
當你使用 awk 同時處理多個檔案的時候,它會将多個檔案合并處理,變量 <code>FILENAME</code> 就表示目前文本行所在的檔案名稱。
在腳本代碼段前面使用 BEGIN 關鍵字時,它會在開始讀取一個檔案之前,運作一次 BEGIN 關鍵字後面的腳本代碼段, BEGIN 後面的腳本代碼段隻會執行一次,執行完之後 awk 程式就會退出。
awk 腳本中可以用多個花括号來執行多個腳本代碼,就像下面這樣:
awk 的 END 指令和 BEGIN 恰好相反,在 awk 讀取并且處理完檔案的所有内容行之後,才會執行 END 後面的腳本代碼段。
可以在 awk 腳本中聲明和使用變量
awk 聲明的變量可以在任何多個花括号腳本中使用
上面這段腳本表示,先聲明兩個變量 a = 12 和 b = 24,然後用 print 列印出 a 加上 b 的結果。
看到上面的輸出結果,為什麼會重複輸出 4 次同樣的計算結果。請記住 awk 是針對檔案的每一行來執行一次單引号 裡面的腳本代碼,每讀取到一行就會執行一次,檔案裡面有多少行就會執行多少次,但 BEGIN 和 END 關鍵字後面的腳本代碼除外,如果被處理的檔案中什麼都沒有,那 awk 就一次都不會執行。。。
awk 還支援其他的數學運算符
<code>+</code> 加法運算符
<code>-</code> 減法運算符
<code>*</code> 乘法運算符
<code>/</code> 除法運算符
<code>%</code> 取餘運算符
比如有一個檔案 company.txt 内容如下
我們要判斷檔案的第 3 列資料,也就是平均工資小于 5500 的公司,然後将其列印輸出
上面的指令結果就是平均工資小于 5500 的公司名單, <code>$3 < 5500</code> 表示當第 3 列字段的内容小于 5500 的時候才會執行後面的 <code>{print $0}</code> 代碼塊
awk 還有一些其他的條件操作符如下
< 小于
<= 小于或等于
== 等于
!= 不等于
> 大于
>= 大于或等于
~ 比對正規表達式
!~ 不比對正規表達式
使用 if 指令判斷來實作上面同樣的效果
上面表示如果第 3 列字段小于 5500 的時候就會執行後面的 <code>print $0</code>,很像 C 語言和 PHP 的文法對不對。
比如現在我們有這麼一個檔案 poetry.txt ,内容如下:
使用正規表達式比對字元串 "There" ,将包含這個字元串的行列印并輸出
使用正規表達式配一個包含字母 t 和字母 e ,并且 t 和 e 中間隻能有任意單個字元的行
如果隻想比對單純的字元串 "t.e", 那正規表達式就是這樣的 <code>/t\.e/</code> ,用反斜杠來轉義 <code>.</code> 符号,因為 <code>.</code> 在正規表達式裡面表示任意單個字元。
正規表達式中的圓括号表示将多個字元當成一個完整的對象來看待。比如 <code>/th(in){1}king/</code> 就表示其中字元串 "in" 必須出現 1 次。而如果不加圓括号就變成了 <code>/thin{1}king/</code> 這個就表示其中字元 "n" 必須出現 1 次。