簡體   English   中英

需要基本的命令行awk語法指南

[英]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之類的函數名稱時,會發生什么?

一次一個:

  1. 有人可以解釋嗎?

是。

  1. 打印是否需要括號?

return一樣, print是一個內置函數,而不是函數,因此根本不使用parens。 當您看到print("foo") ,parens與字符串"foo"關聯,盡管看起來"foo" ,但它們絕不是print命令的一部分。 將其寫為print ("foo")可能更清楚(但在這種情況下仍然沒有用print ("foo")

  1. 是否需要分號?

語句不在單獨的行時不行。 像在shell中一樣,將需要使用分號來分隔單行中出現的語句

  1. 是否需要BEGIN?

否。請注意, BEGIN是代表打開第一個輸入文件以進行讀取之前存在的條件的關鍵字,因此BEGIN{print}將僅打印空白行,因為尚未讀取任何內容進行打印。 /pattern/ BEGIN也是廢話,應該產生語法錯誤。

  1. 當您使用/ pattern /啟動awk腳本,並且/或者僅將其本身傳遞給諸如print之類的函數名稱時,會發生什么?

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 recordawk '{ print }'表示the default condition of TRUE applies so execute the specified action and print the current record 缺省情況下, print也不打印當前記錄,所以print $0print只是同義詞。

如果您正在考慮開始使用awk,請閱讀Arnold Robbins的《有效的Awk編程》一書,至少閱讀第一章或第2章。

函數調用require () 語句不(但似乎允許它們)。

printprintf是語句,因此不需要() (但支持它:“整個項目列表可以選擇包含在括號中。”)

印刷品中我們還發現

沒有任何項目的簡單語句“ print”等效於“ print $ 0”:它打印整個當前記錄。

因此,我們現在知道前三個語句是相同的。

動作中我們發現了這一點。

一個動作由一個或多個用大括號('{…}')括起來的awk語句組成。

然后

語句用換行符或分號分隔。

這告訴我們分號是“分隔符”,而不是終止符,因此在操作結束時不需要分號,因此我們現在知道第四個分號也是相同的。

BEGIN是一種特殊的模式

[a] BEGIN規則僅在讀取第一個輸入記錄之前執行一次。

因此,第五個是不同的,因為它在開始時只運行一次,而不是在每一行上運行。

最后一個是語法錯誤,因為它具有彼此相鄰的兩個模式,而沒有中間的動作或分隔符。

所有這些awk命令(后兩個除外)都可以簡化為:

awk '/pattern/' file

因為print總是awk的動作。

分號在}之前是可選的。

您不能將BEGIN放在/pattern/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM