使用 awk for grep 查找带有换行符的模式
Use awk for grep to find a pattern with a line break
我有类似的代码块
<service id="http-upgrade-service" class="HTTPUpgrade">
<maxHeaderSize>65536</maxHeaderSize>
当我尝试为这种模式使用 grep 或 awk 时,return 没有这一行。文件中的另一部分有一个 headerSize 参数,这也导致了问题
这些是我尝试过的一些选项
awk '/<service id="http-upgrade-service" class="HTTPUpgrade"/ ,/<maxHeaderSize>65536</maxHeaderSize>/' file
grep -n -E '<service id="http-upgrade-service" class="HTTPUpgrade">*\n<maxHeaderSize>65536<\/maxHeaderSize>' head -n 1 file
grep -e '<service id="http-upgrade-service" class="HTTPUpgrade"> -e `<maxHeaderSize>65536</maxHeaderSize>' file
grep -Pzl '(?s)<service id="http-upgrade-service" class="HTTPUpgrade">*\n.<maxHeaderSize>65536</maxHeaderSize>' file
grep -oP '(?<=<service id="http-upgrade-service" class="HTTPUpgrade"> )\w+(?=<maxHeaderSize>65536</maxHeaderSize>)'
awk '/<service id="http-upgrade-service" class="HTTPUpgrade">/ ,/<maxHeaderSize>65536</maxHeaderSize>/ {print}' file
正在尝试匹配包含两个行值的模式。
使用 GNU grep -z
、-o
和 \s
shorthand [[:space:]]
:
$ grep -zo '<service id="http-upgrade-service" class="HTTPUpgrade">\s*<maxHeaderSize>65536</maxHeaderSize>' file
<service id="http-upgrade-service" class="HTTPUpgrade">
<maxHeaderSize>65536</maxHeaderSize>
你没有在你的问题中显示预期的输出,所以我猜你想要匹配的字符串,如果这不是你想要的,你可以按摩以适应。
您可以在 GNU sed -z
或 GNU awk -v RS='^$'
中使用相同的正则表达式,所有这些都像 GNU grep -z
:[=22 一样将整个文件一次读入内存=]
$ sed -Ez 's:.*(<service id="http-upgrade-service" class="HTTPUpgrade">\s*<maxHeaderSize>65536</maxHeaderSize>).*::' file
<service id="http-upgrade-service" class="HTTPUpgrade">
<maxHeaderSize>65536</maxHeaderSize>
$ awk -v RS='^$' 'match([=11=],/.*(<service id="http-upgrade-service" class="HTTPUpgrade">\s*<maxHeaderSize>65536<\/maxHeaderSize>).*/,a){print a[1]}' file
<service id="http-upgrade-service" class="HTTPUpgrade">
<maxHeaderSize>65536</maxHeaderSize>
或在段落模式下使用任何 POSIX awk,因为您要匹配的块中没有空行:
$ awk -v RS='' 'match([=12=],/<service id="http-upgrade-service" class="HTTPUpgrade">[[:space:]]*<maxHeaderSize>65536<\/maxHeaderSize>/){print substr([=12=],RSTART,RLENGTH)}' file
<service id="http-upgrade-service" class="HTTPUpgrade">
<maxHeaderSize>65536</maxHeaderSize>
如果您没有 POSIX awk,请将 [:space:]
替换为 [ \t\n]
然后以上将在任何 awk 中工作,假设您没有任何额外的space 输入中的字符回车 return、换页符和垂直制表符(如果这样做,请将它们添加到括号表达式的列表中)。
我有类似的代码块
<service id="http-upgrade-service" class="HTTPUpgrade">
<maxHeaderSize>65536</maxHeaderSize>
当我尝试为这种模式使用 grep 或 awk 时,return 没有这一行。文件中的另一部分有一个 headerSize 参数,这也导致了问题
这些是我尝试过的一些选项
awk '/<service id="http-upgrade-service" class="HTTPUpgrade"/ ,/<maxHeaderSize>65536</maxHeaderSize>/' file
grep -n -E '<service id="http-upgrade-service" class="HTTPUpgrade">*\n<maxHeaderSize>65536<\/maxHeaderSize>' head -n 1 file
grep -e '<service id="http-upgrade-service" class="HTTPUpgrade"> -e `<maxHeaderSize>65536</maxHeaderSize>' file
grep -Pzl '(?s)<service id="http-upgrade-service" class="HTTPUpgrade">*\n.<maxHeaderSize>65536</maxHeaderSize>' file
grep -oP '(?<=<service id="http-upgrade-service" class="HTTPUpgrade"> )\w+(?=<maxHeaderSize>65536</maxHeaderSize>)'
awk '/<service id="http-upgrade-service" class="HTTPUpgrade">/ ,/<maxHeaderSize>65536</maxHeaderSize>/ {print}' file
正在尝试匹配包含两个行值的模式。
使用 GNU grep -z
、-o
和 \s
shorthand [[:space:]]
:
$ grep -zo '<service id="http-upgrade-service" class="HTTPUpgrade">\s*<maxHeaderSize>65536</maxHeaderSize>' file
<service id="http-upgrade-service" class="HTTPUpgrade">
<maxHeaderSize>65536</maxHeaderSize>
你没有在你的问题中显示预期的输出,所以我猜你想要匹配的字符串,如果这不是你想要的,你可以按摩以适应。
您可以在 GNU sed -z
或 GNU awk -v RS='^$'
中使用相同的正则表达式,所有这些都像 GNU grep -z
:[=22 一样将整个文件一次读入内存=]
$ sed -Ez 's:.*(<service id="http-upgrade-service" class="HTTPUpgrade">\s*<maxHeaderSize>65536</maxHeaderSize>).*::' file
<service id="http-upgrade-service" class="HTTPUpgrade">
<maxHeaderSize>65536</maxHeaderSize>
$ awk -v RS='^$' 'match([=11=],/.*(<service id="http-upgrade-service" class="HTTPUpgrade">\s*<maxHeaderSize>65536<\/maxHeaderSize>).*/,a){print a[1]}' file
<service id="http-upgrade-service" class="HTTPUpgrade">
<maxHeaderSize>65536</maxHeaderSize>
或在段落模式下使用任何 POSIX awk,因为您要匹配的块中没有空行:
$ awk -v RS='' 'match([=12=],/<service id="http-upgrade-service" class="HTTPUpgrade">[[:space:]]*<maxHeaderSize>65536<\/maxHeaderSize>/){print substr([=12=],RSTART,RLENGTH)}' file
<service id="http-upgrade-service" class="HTTPUpgrade">
<maxHeaderSize>65536</maxHeaderSize>
如果您没有 POSIX awk,请将 [:space:]
替换为 [ \t\n]
然后以上将在任何 awk 中工作,假设您没有任何额外的space 输入中的字符回车 return、换页符和垂直制表符(如果这样做,请将它们添加到括号表达式的列表中)。