[英]Need a guide to basic command-line awk syntax
我已經閱讀了幾個awk教程,並在此處看到了許多問題和答案, 問題是我在人們如何制作awk 1-liners方面看到了很多變化,這在我看來確實使它變得過於復雜。
所以我看到這樣的事情:
awk '/pattern/ { print }'
awk '/pattern/ { print $0 }'
awk '/pattern/ { print($0) }'
awk '/pattern/ { print($0); }'
awk 'BEGIN { print }'
awk '/pattern/ BEGIN { print };
有時我會收到錯誤,有時卻不會,但是由於我看到太多不同的措詞,我確實很難解決語法錯誤,因為我無法弄清楚允許和不允許的錯誤。
有人可以解釋嗎? 打印是否需要括號? 是否需要分號? 是否需要BEGIN? 當您使用/ pattern /啟動awk腳本,並且/或者僅將其本身傳遞給諸如print
之類的函數名稱時,會發生什么?
一次一個:
是。
像return
一樣, print
是一個內置函數,而不是函數,因此根本不使用parens。 當您看到print("foo")
,parens與字符串"foo"
關聯,盡管看起來"foo"
,但它們絕不是print
命令的一部分。 將其寫為print ("foo")
可能更清楚(但在這種情況下仍然沒有用print ("foo")
。
語句不在單獨的行時不行。 像在shell中一樣,將需要使用分號來分隔單行中出現的語句
否。請注意, BEGIN
是代表打開第一個輸入文件以進行讀取之前存在的條件的關鍵字,因此BEGIN{print}
將僅打印空白行,因為尚未讀取任何內容進行打印。 /pattern/ BEGIN
也是廢話,應該產生語法錯誤。
awk腳本由condition { <action> }
節組成,默認條件為TRUE,默認操作為print $0
。 因此, awk '/pattern/'
表示if the regexp "pattern" exists in the current record then invoke the default action which is to print that record
而awk '{ print }'
表示the default condition of TRUE applies so execute the specified action and print the current record
。 缺省情況下, print
也不打印當前記錄,所以print $0
與print
只是同義詞。
如果您正在考慮開始使用awk,請閱讀Arnold Robbins的《有效的Awk編程》一書,至少閱讀第一章或第2章。
函數調用require ()
。 語句不(但似乎允許它們)。
print和printf是語句,因此不需要()
(但支持它:“整個項目列表可以選擇包含在括號中。”)
從印刷品中我們還發現
沒有任何項目的簡單語句“ print”等效於“ print $ 0”:它打印整個當前記錄。
因此,我們現在知道前三個語句是相同的。
從動作中我們發現了這一點。
一個動作由一個或多個用大括號('{…}')括起來的awk語句組成。
然后
語句用換行符或分號分隔。
這告訴我們分號是“分隔符”,而不是終止符,因此在操作結束時不需要分號,因此我們現在知道第四個分號也是相同的。
BEGIN
是一種特殊的模式 ,
[a] BEGIN規則僅在讀取第一個輸入記錄之前執行一次。
因此,第五個是不同的,因為它在開始時只運行一次,而不是在每一行上運行。
最后一個是語法錯誤,因為它具有彼此相鄰的兩個模式,而沒有中間的動作或分隔符。
所有這些awk命令(后兩個除外)都可以簡化為:
awk '/pattern/' file
因為print
總是awk
的動作。
分號在}
之前是可選的。
您不能將BEGIN
放在/pattern/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.