Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用awk在文件的多行上查找字符串_Linux_Bash_Shell_Awk - Fatal编程技术网

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行,第三行两者都有?