![](/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.