繁体   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