Classic Shell Scripting 讀書筆記 (五)
AWK
- 所有 UNIX 系統裡都至少有一套 awk
- awk 是 POSIX 的一部分
- 把輸入流看成一連串紀錄(record)的集合,每筆紀錄可以更進一步細分成字段(field)
- 如何構成一筆紀錄和一個字段,是可控制的,甚至可以在處理期間修改
- 替使用者妥善處理每個文件的開啟、讀取與關閉
- 強大的功能大多是具備對正則表達式的支援
命令行
1 2 |
awk [ -F fs ] [ -v var=value ... ] 'program' [ -- ] [ var=value ... ] [ file(s) ] |
- 慣例是將
-F
當作第一個選項,或者也可以設定變量FS
來重新定義分隔符12awk -F ':' '{ ... }' files FS="[\f\v]" files以上面例子來看,
-F
應用到第一個文件組,而FS
應用到第二個文件組 -
--
是特殊選項,指出 awk 本身已經沒有更進一步的命令行選項 - 初始化的
-v
必須放在 program 之前,在文件處理之前生效 - program 使用單引號,保護內容不被 Shell 解釋,不過要特別注意程序是否本身包含單引號
程序元素
- 提供標量(scalar)、陣列(array)兩種資料結構
- 提供語句類型:賦值、註釋、條件、函數、輸入、循環、輸出
字串表達式
- 以雙引號定界
- 長度沒有任何限制,視內存而定
- 賦值後舊字串的內存空間會自動回收
- 字串的比較視字串長短而定,如 “A” < “AA” 返回 1
- awk 無字串連接的運算符,多個連續的字串,會自動連接在一起
- 數字轉字串,可透過連接空字串,如 s = “” + 123
正則匹配語句
- 提供兩個運算符:
~
、!~
分別代表匹配和不匹配 - 正則常量可以用雙引號或斜槓
/
定界,斜槓形式比較常見,因為可以用來強調括起來的就是正則表達式 - 字面意義的引號、斜槓、反斜槓在正則裡都應該被保護,兩種形式的保護方式可能不同,例如
"\\\\TeX"
與/\\Tex/
都是表示正則的\Tex
數值表達式
- 所有 awk 裡的數字都以雙精確度的浮點值(對應於 C 的 double)表示
- awk 在 IEEE 754 廣泛可用前就以開發,無法完整支持 Infinity 與 NaN
- 浮點數可以包含一個末端以字母 e(或 E)所表示的十次方指數,例如 0.03125、3.125e-2、0.003125E1
- 字串轉數字,可透過連接0,如 n = 0 + “123”