Bash Shell: 在特定字符串和分隔符之间查找?

Bash Shell: grepping between specific string and delimiter?

我需要检查 "slave=new" 字符串是否以特定模式存在于字符串 "localhost" 下方。模式示例如下所示。这个想法是从 "localhost" 字符串开始检查并在“;;”之前结束分隔符? 我想办法检查 "slave=new" 是否在本地主机之后的第二行,

grep -A1 "localhost" file| tail -1

但有可能放在“;;”之前的其余行。

模式如下:

(frasdsp221)
   slave=new
   blablabla
   tintirimintiri
;;

  (localhost)
   blobloblo
   slave=new
   blablabla
;;


  (asdasd421)
   slave=new
   blablabla
   tintirimintiri
;;

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

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

它只是使用一个 looking 标志,当您看到 (localhost) 行时打开该标志,当您看到 ;; 行时关闭该标志。

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

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

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

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

输出:

  (localhost)
   blobloblo
   slave=new
   blablabla

使用 grep 的解决方案:

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