Bash Shell:特定字符串和分隔符之间的grepping?

时间:2015-10-06 09:58:06

标签: bash shell scripting

我需要检查" slave = new"字符串存在于字符串" localhost"以特定的模式。模式的示例如下所示。我们的想法是从" localhost"开始检查。字符串并结束之前&#34 ;;;"分隔符? 我想办法检查" slave = new"在localhost之后的第二行,

grep -A1 "localhost" file| tail -1

但是有可能在&#34 ;;;"之前放在其余的行上。

以下是模式:

(frasdsp221)
   slave=new
   blablabla
   tintirimintiri
;;

  (localhost)
   blobloblo
   slave=new
   blablabla
;;


  (asdasd421)
   slave=new
   blablabla
   tintirimintiri
;;

3 个答案:

答案 0 :(得分:1)

您可以使用awk执行此操作,例如:

awk '
    /(localhost)/               { looking = 1 }
    (looking==1) && /slave=new/ { print "found it"; exit }
    /;;/                        { looking = 0 }
' inputfile

它只是使用looking标记,当您看到(localhost)行时会显示该标记,当您看到;;行时会将其关闭。

如果您在标志开启时在任何时候看到slave=new行,它会告诉您并退出,以免浪费更多资源。

答案 1 :(得分:1)

使用gnu-awk,您可以使用自定义RS(记录分隔符):

awk -v RS=';;' '/\(localhost\).*slave=new/' file

由于我们正在使用RS=';;' awk为我们提供单个记录中的每个块,然后我们可以使用简单的正则表达式/\(localhost\).*slave=new/进行搜索,以确保(localhost)slave=new都存在在同一个街区。

<强>输出:

  (localhost)
   blobloblo
   slave=new
   blablabla

答案 2 :(得分:0)

使用grep的解决方案:

$ grep -zPo '\(localhost\)(.|\n)*?slave=new(.|\n)*?;;' file
(localhost)
   blobloblo
   slave=new
   blablabla
;;