簡體   English   中英

使用awk在多個字段中基於模式匹配打印行

[英]printing lines based on pattern matching in multiple fields using awk

假設我有一個類似html的輸入

<li>this is a html input line</li>

我想從以<li>開始並以</li>結束的文件中過濾所有這些輸入行。 現在,我的想法是使用以下awk命令在第一個字段中搜索模式<li>在最后一個字段中搜索模式</li>

awk '$1 ~ /\<li\>/ ; $NF ~ /\</li\>/ {print $0}'

但似乎沒有規定一次匹配兩個字段,或者我在語法上犯了一些錯誤。 你能在這里幫我嗎?

PS:我正在使用Solaris SunOS計算機。

Solaris上的腳本有很多錯誤:

awk '$1 ~ /\<li\>/ ; $NF ~ /\</li\>/ {print $0}'
  1. Solaris上的默認awk(因此,您必須聲明您正在使用的awk,因為您沒有另外聲明)是舊的,損壞的awk,切勿使用。 在Solaris上,使用/usr/xpg4/bin/awk 還有nawk但它有更少的POSIX功能(例如,用於字符類不支持)。
  2. \\<...\\>是gawk特定的單詞邊界。 Solaris上沒有awk可以識別這些。 如果您只是想獲取文字字符,則無需轉義它們,因為它們不是正則表達式元字符。
  3. 如果要測試條件1和條件2,則將&&放在兩者之間,而不是; 這只是語句終止符來代替換行符。
  4. 給定真實條件的默認操作是{print $0}因此您無需顯式編寫該代碼。
  5. /是awk正則表達式分隔符,因此您確實需要在正則表達式中間進行轉義。
  6. 默認的字段分隔符是空格,因此在發布的示例輸入中, $1$NF將是<li>thisline</li> ,而不是<li></li>

因此,如果由於某種原因DID比較多個字段,則可以執行以下操作:

awk '($1 ~ /^<li>.*/) && ($NF ~ /.*<\/li>$/)'

但這可能是您真正想要的:

awk '/^<li>.*<\/li>/'

在這種情況下,您可以使用grep:

grep '^<li>.*</li>'

為什么不使用正則表達式來匹配行的開頭和結尾,例如

awk '/^[[:space:]]*<li>.*<\/li>[[:space:]]*$/ {print}'

盡管通常來說,如果您要處理HTML,最好使用專門設計用於處理HTML的工具。

暫無
暫無

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

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