Awk

運算符的 awk 正則表達式

  • August 13, 2021

我想用我的 awk 正則表達式計算和總結文件中的匹配數。

該文件file包含:

Gra pes
gra ndma
straw berry
blue Berry
banana
peanut
school

我需要為模式匹配製作一個正則表達式,但我不確定如何在正則表達式中實現AND/OR,儘管它們具有相同的優先級。

我努力了:

awk 'tolower($1) ~ /(gra|straw) (pes|berry)|banana|peanut/ {sum+=1} END {print sum+0}' file

所以它應該是(gra pes, gra berry, straw pes, straw berry) OR banana, peanut並且返回 4,因為有 4 個匹配項。

我假設我的OR香蕉|花生的語法有問題,但我不知道如何解決它。

關於出了什麼問題的任何想法?謝謝你

你的正則表達式很好。你的問題是你匹配它tolower($1)是第一個欄位(空格分隔的預設值FS)轉換為小寫。

因此,例如,在第一行 ( Gra pes) 中,它將匹配正則表達式gra並失敗。

對於整個記錄,您想要$0

awk 'tolower($0) ~ /regexp/ ...'

另請注意,正則表達式預設情況下不會錨定,因此它將匹配peanutbutter例如在其中peanut找到的內容。如果您希望輸入記錄與正則表達式作為一個整體匹配,您需要:

awk 'tolower($0) ~ /^(foo|bar)$/'

與主語開頭( )匹配,^後跟其中一個foobar後跟主語( $)。請注意,括號在那裡很重要。^foo|bar$將是^foo(foo在開始時) 或bar$(bar在結束時),因此將匹配 onfooXYbar例如。

引用自:https://unix.stackexchange.com/questions/664504