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