Awk 入門/控制結構
外觀
< Awk 入門
Awk 支援類似於 C 中使用的控制結構,包括
if ... elsewhileforbreakcontinue
還有一些與 C 中不同的控制結構
for (x in a)- 陣列迴圈next- 轉到下一個輸入記錄exit- 停止處理輸入檔案,執行 END 操作(如果指定),然後結束。
"if ... else" 的語法為
if (<condition>) <action 1> [else <action 2>]
"else" 子句是可選的。 "condition" 可以是模式匹配部分中討論的任何表示式,包括與正則表示式的匹配。 例如,考慮以下 Awk 程式
{
if ($1=="green") print "GO";
else if ($1=="yellow") print "SLOW DOWN";
else if ($1=="red") print "STOP";
else print "SAY WHAT?";
}
(在這裡,分號是可選的,可以省略。)
順便說一下,為了測試目的,這個程式可以呼叫為
echo "red" | awk -f pgm.txt
—其中 "pgm.txt" 是包含該程式的文字檔案。
"action" 子句可以包含多個語句,用花括號 ("{}") 括起來。
"while" 的語法為
while (<condition>) <action>
只要 "condition" 測試為真, "action" 就執行,並且
"condition" 在每次迭代之前進行測試。 條件與 "if ... else" 結構中的條件相同。 例如,由於預設情況下 Awk 變數的值為 0,因此以下 Awk 程式可以列印從 1 到 20 的數字
BEGIN {x=0; while(x<=20) {++x; print x}}
- "for" 迴圈更靈活。 它的語法是
for (<initial action>;<condition>;<end-of-loop action>) <action>
例如,以下 "for" 迴圈以 2 為增量列印數字 10 到 20
BEGIN {for (i=10; i<=20; i+=2) print i}
這相當於
i=10
while (i<=20) {
print i
i+=2
}
C 程式語言有類似的 "for" 結構,一個有趣的特性是,只需用逗號分隔操作,就可以在初始化和迴圈結束操作中執行多個操作。 不幸的是,大多數 Awk 實現不支援此功能。
"for" 迴圈有一個備用語法,用於掃描陣列
for (<variable> in <array>) <action>
給定前面使用的示例
my_string = "joe:frank:harry:bill:bob:sil"; split(my_string, names, ":");
—那麼可以使用以下語句列印名稱
for (idx in names) print idx, names[idx];
這將產生
2 frank 3 harry 4 bill 5 bob 6 sil 1 joe
請注意,這些名稱沒有按正確順序列印。 這種 "for" 迴圈的一個特點是,陣列不是以可預測的順序掃描的。
Awk 定義了四個無條件控制語句:break、continue、next 和 exit。
語句 break 和 continue 嚴格地與 while 和 for 迴圈相關聯
- break: 導致跳出迴圈。
- continue: 強制執行迴圈的下一輪迭代。
語句 next 和 exit 控制 Awk 的輸入掃描
- next: 導致 Awk 立即獲取另一行輸入並從第一個匹配語句開始掃描。
- exit: 導致 Awk 停止讀取其輸入,執行 END 操作(如果指定),然後結束。