
我注意到一個 O'Reillyawk
範例(1997),它透過在命令列上設定 awk 變數來分配它後程式文本。它確實有效,但我找不到這個語法人/資訊 awk。我剛剛錯過了嗎?是不是已經貶值了...?我在手冊中看到的唯一語法是-v
選項。
awk '/home/{print foo, bar}' foo="cat" bar="dog" /proc/$$/cmdline
輸出:cat dog
答案1
它實際上是在 POSIX 中awk
(連結到 POSIX 2008,我相信以前的版本也有它)。-v
描述於選項部分,另一種方式是在操作數部分。
-v
最後透過檔案名稱傳遞賦值是有差別的:
- 和
-v
:
應用程式應確保賦值參數與賦值運算元的形式相同。指定的變數賦值應發生在執行 awk 程序之前,包括與 BEGIN 模式相關的操作(如果有的話)。可以指定此選項多次出現。
- 與檔案名稱混合:
[...]每個這樣的變數賦值都應發生在處理以下文件之前,如果有的話。因此,第一個檔案參數之前的賦值應在 BEGIN 操作(如果有)之後執行,而最後一個檔案參數之後的賦值應在 END 操作(如果有)之前執行。如果沒有檔案參數,則應在處理標準輸入之前執行賦值。
例子:
$ cat input
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
var=two input var=three input var=four
one
two
two
three
three
four
答案2
這是在外部設定變數的舊風格awk
。它是不明確的(如果你有一個名為 的檔案名稱怎麼辦foo=cat
),所以後來的版本添加了一個-v
選項。它可能應該適用於向後相容,但你不能保證。正如我所說,該-v
選項較新,因此並非所有版本awk
都支援它。