使用 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、换页符和垂直制表符(如果这样做,请将它们添加到括号表达式的列表中)。