跳轉到內容

Awk 入門/Awk 呼叫和操作

來自華夏公益教科書,開放書籍,開放世界

Awk 的呼叫方式如下

awk -Fch  -f program-file  variables  input-files

給 Awk 的每個引數都是可選的。

欄位分隔符

[編輯 | 編輯原始碼]

給 Awk 的第一個選項,-F,讓你可以改變欄位分隔符。通常,我們資料檔案中的每個“單詞”或欄位都是由空格分隔的。這可以改變成任何一個字元。許多檔案是製表符分隔的,所以每個資料欄位(比如金屬、重量、國家、描述等)都是由製表符分隔的。使用製表符允許在欄位中包含空格。其他常見的欄位分隔符是冒號或分號。

例如,檔案 "/etc/passwd"(在 Unix 或 Linux 系統上)包含所有使用者的列表,以及一些資料。每個欄位都用冒號分隔。這個示例程式列印每個使用者的名稱和 ID 號

awk -F:  '{ print $1, $3 }' /etc/passwd

注意冒號用作欄位分隔符。這個程式沒有它就無法工作。

程式檔案

[編輯 | 編輯原始碼]

Awk 程式通常具有以下形式

BEGIN { initializations }  search pattern 1 { program actions } search pattern 2 { program actions } ... END { final actions }

同樣,如果不需要,每個部分都是可選的。

如果你將 Awk 程式輸入到一個單獨的檔案中,請使用-f選項告訴 Awk 該檔案的路徑和名稱。對於較大、更復雜的程式,你一定想要使用程式檔案。這允許你將每個語句放在單獨的一行上,並充分利用空格和縮排以提高可讀性。對於簡短、簡單的程式,你可以直接在命令列中鍵入程式。

如果 Awk 程式是在命令列中編寫的,它應該用單引號而不是雙引號括起來,以防止 shell 將程式中的字元解釋為特殊 shell 字元。請記住,COMMAND.COM shell(用於 Windows 和 DOS)不允許以這種方式使用單引號。當然,如果需要這種解釋,可以使用雙引號。Awk 程式中那些 shell 不應解釋的特殊 shell 字元應該用反斜槓開頭。

也可以在命令列中初始化 Awk 變數。這顯然只在 Awk 程式儲存在一個檔案中,或者它是 shell 指令碼中的一個元素時才有用。在命令列中編寫的指令碼中需要的任何初始值都可以作為程式文字的一部分寫入。

考慮上一章中計算硬幣收藏價值的程式示例。銀和金的當前價格嵌入在程式中,這意味著每次兩種金屬的價格發生變化時都必須修改程式。指定程式呼叫時的價格會簡單得多。

原始程式的主要部分寫成

/gold/    { num_gold++; wt_gold += $2 }
/silver/  { num_silver++; wt_silver += $2 } 
END {
    val_gold   = 485 * wt_gold
    val_silver = 16 * wt_silver
    ...

金和銀的價格可以用變數來指定,比如pgps

END {
    val_gold   = pg * wt_gold
    val_silver = ps * wt_silver
    ...

程式將使用命令列中的變數初始化呼叫,如下所示

awk -f summary.awk pg=485 ps=16 coins.txt

這會產生與之前相同的結果。注意,變數初始化被列為pg=485ps=16,而不是pg = 485ps = 16;不建議包含空格,因為它可能會混淆命令列解析。

資料檔案(s)

[編輯 | 編輯原始碼]

命令列末尾是資料檔案。這是 Awk 應該用你的程式處理的檔案的名稱,就像我們之前示例中的 "coins.txt" 一樣。

也可以指定多個數據檔案。Awk 將依次掃描它們,並從多個檔案的內容生成一個連續的輸出,就像它們是一個長檔案一樣。

  1. 如果你還沒有,嘗試執行“欄位分隔符”中的程式來列出所有使用者。看看不使用-F:會發生什麼。(如果你沒有使用 Unix 或 Linux,抱歉;它不會工作。)
  2. 編寫一個 Awk 程式,將“coins.txt”(來自前幾章)轉換成一個製表符分隔的檔案。這將需要“管道”,這取決於你的系統而有所不同,但你可能應該寫一些類似 > tabcoins.txt 的東西,將 Awk 的輸出傳送到一個新檔案而不是螢幕。
  3. 現在,用-F'\t'重新執行“summary.awk”。單引號是必需的,這樣 Awk 才能將“\t”處理為製表符而不是“\”和“t”這兩個字元。欄位現在可以包含空格,而不會影響輸出。嘗試將一些金屬改為“純金”或“98% 純銀”,看看它是否有效。
  4. 嘗試使用一些其他命令列選項,例如多個輸入檔案。
  5. 編寫一個程式,作為簡單的計算器。它不需要輸入檔案;讓它從鍵盤接收輸入。輸入應該是兩個數字,中間有一個運算子(如 + 或 -),所有這些都用空格分隔。匹配包含這些模式的行,並輸出結果。
如果你需要 #5 的提示,請開啟這個框。

你的程式應該包含類似這樣的行

$2=="+" { print ($1 + $3) }


在下一章中,你將被介紹 Awk 最顯著的功能:模式匹配。

華夏公益教科書