Linux 使用awk在文件的多行上查找字符串
我试图检查某个文件是否有两个字符串。我的测试文件是:Linux 使用awk在文件的多行上查找字符串,linux,bash,shell,awk,Linux,Bash,Shell,Awk,我试图检查某个文件是否有两个字符串。我的测试文件是: 这是一号线。 这是2号线。 在我的应用程序的实时场景中,字符串line1和line2可以位于相同或不同的行上,也可以出现一次或多次。目标是查找文件中是否存在这些字符串 现在,如果我运行以下命令,我希望可以打印OK,但它没有打印出来。 cat test_file.sh|awk'$0~/line1/&&/line2/{print“OK”};' 有人能告诉我这里需要更改的内容吗。您的awk命令正在同一行中查找line1和line2。在不同行上搜
这是一号线。
这是2号线。
在我的应用程序的实时场景中,字符串line1
和line2
可以位于相同或不同的行上,也可以出现一次或多次。目标是查找文件中是否存在这些字符串
现在,如果我运行以下命令,我希望可以打印OK,但它没有打印出来。cat test_file.sh|awk'$0~/line1/&&/line2/{print“OK”};'代码>
有人能告诉我这里需要更改的内容吗。您的awk命令正在同一行中查找line1
和line2
。在不同行上搜索两个字符串的正确方法是:
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/
将在两个不同的行上搜索两个关键字,而不考虑它们的顺序
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
您还可以使用grep和wc来实现这一点。例如:
cat ./file | grep "line1\|line2" | wc -l
将返回这两个字符串(“line1”和“line2”)所在的行数。如果返回1,则它们位于同一行。如果返回2,则它们位于单独的行上。这里我们存储模式出现的行号,并最终决定输入是否正确
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";
}
}
您正在检查两个模式是否在同一行上。它们总是在连续行上,还是在这两行之间可能有其他行?“他们出现的顺序是否重要?”埃德·莫顿不,顺序不重要。中间可以有多行。然后编辑您的问题,并显示一个比连续两行更有趣/具有代表性/可能有问题的示例。这两个字符串可以在同一行吗?请说明您对此的要求。当第一行是同时包含第1行和第2行的行,第二行是仅包含第2行的行,我们是否同意,但是当第2行出现时,您希望它也能工作。好的,所有明确的要求都得到了满足。echo“pattern1pattern2”| awk'/pattern1/{s=1}/pattern2/{t=1}s&&t{print“OK”;exit}'
在同一行上给出两个模式的OK。是的,不管行是相同的还是不同的,仅使用不同的行更新代码。当文件中没有第2行时,还将返回第1行。编辑后:将两次找到子字符串第1行位于两个不同行上的文件(sort-u
)。您应该执行2次greps,并验证两次都至少命中一次。还要检查p1和p2是否都>0。那么三行怎么样,第一行只有第1行,第二行只有第2行,第三行两者都有?