我需要检查" 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
;;
答案 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
;;