簡體   English   中英

使用awk在文件的多行中查找字符串

[英]find string on multiple lines of file using awk

我正在嘗試檢查某個文件是否具有兩個字符串。 我的測試文件是:
This is line1. This is line2.

在我的應用程序的實時場景中,字符串line1line2可以在相同或不同的行上,也可以出現一次或多次。 目的是查找文件中是否存在這些字符串。

現在,如果我運行以下命令,我希望可以打印確定,但不會打印。
cat test_file.sh | awk '$0 ~ /line1/ && /line2/ {print "OK"};'

有人可以告訴我我需要在這里更改什么嗎?

您的awk命令正在嘗試在同一行上找到line1line2 在不同行上搜索2個字符串的正確方法是:

sed '/^[[:blank:]]*$/d' |
awk -v RS= '/line1[^\n]*\n.*line2/ || /line2[^\n]*\n.*line1/{print "Ok"}'
  • sed將從輸入中刪除所有空白行
  • -v RS=將輸入記錄分隔符設置為NULL,因此忽略換行作為記錄分隔符。
  • /line1[^\\n]*\\n.*line2/ || /line2[^\\n]*\\n.*line1/ /line1[^\\n]*\\n.*line2/ || /line2[^\\n]*\\n.*line1/將在2個不同的行上搜索2個關鍵字,而不考慮其順序

您也可以使用grep和wc完成此操作。 例如:

cat ./file | grep "line1\|line2" | wc -l

將返回這兩個字符串(“ line1”和“ line2”)打開的行數。 如果返回1,則它們位於同一行。 如果返回2,則它們位於單獨的行上。

awk解救!

awk '/pattern1/{s=1} /pattern2/{t=1} s&&t{print "OK"; exit}' file

不論順序如何,都會檢查兩種模式。

如果您希望他們嚴格遵循不同的原則

awk '/pattern1/{s=1;next}
     /pattern2/{t=1;next}
           s&&t{print "OK"; exit}
            END{if(s&&t) print "OK"}' file

在這里,我們存儲發生模式的行號,並最終確定輸入是否正常。

BEGIN {p1=0; p2=0;}

/This is line1./ { p1 = FNR}
/This is line2./ { p2 = FNR}

END { if( p1== p2 ) {
    print "not ok";
  }
  else {
    print "ok";
  }
}

暫無
暫無

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

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