![](/img/trans.png)
[英]how to find a file name that contains a string "abcd " in the file content from multiple files in the directory using awk
[英]find string on multiple lines of file using awk
我正在嘗試檢查某個文件是否具有兩個字符串。 我的測試文件是:
This is line1. This is line2.
在我的應用程序的實時場景中,字符串line1
和line2
可以在相同或不同的行上,也可以出現一次或多次。 目的是查找文件中是否存在這些字符串。
現在,如果我運行以下命令,我希望可以打印確定,但不會打印。
cat test_file.sh | awk '$0 ~ /line1/ && /line2/ {print "OK"};'
有人可以告訴我我需要在這里更改什么嗎?
您的awk命令正在嘗試在同一行上找到line1
和line2
。 在不同行上搜索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.