Grep 如何快速查找丢失的行

Grep 如何快速查找丢失的行,grep,text-processing,Grep,Text Processing,我有一个包含以下方式记录的HTTP请求的文件 POST pathX header1: any header2: any header3: CONSTANT POST pathX header1: any header2: any POST pathX header1: any header2: any header3: CONSTANT ... 我想查找路径“pathX”上的所有请求,这些请求不包含header3。 每个请求的标题行数可能不同, 但通常是3或4 我可以找到对pathX

我有一个包含以下方式记录的HTTP请求的文件

POST pathX 
header1: any
header2: any
header3: CONSTANT

POST pathX 
header1: any
header2: any

POST pathX 
header1: any
header2: any
header3: CONSTANT
...
我想查找路径“pathX”上的所有请求,这些请求不包含header3。
每个请求的标题行数可能不同, 但通常是3或4

我可以找到对pathX的所有请求,并显示以下4行

cat file | grep "pathX" -A 4

这将找到所有3个请求,但我真正想要的只是第二个没有
“header3:CONSTANT”
行的请求。

使用正常的grep正则表达式很棘手。但是,如果您可以访问支持Perl兼容正则表达式(PCRE)的程序,如
pcregrep
,则可以执行以下操作:

pcregrep <file -M '(?s)^POST pathX(?:(?!^header3:).)*?(\n\n|\Z)'
带awk的pcregrep:

awk -v RS=  '/pathX/ && !/header3/' file
使用输入文件,输出为:

$ awk -v RS=  '/pathX/ && !/header3/' file
POST pathX 
header1: any
header2: any
工作原理
  • -vrs=

    这告诉awk使用空行作为记录分隔符。这意味着每个请求(POST和header)都作为一条记录读入

  • /pathX/&&/标题3/

    这会告诉awk打印任何包含
    pathX
    但不包含
    header3
    的记录


如果您有GNU grep,请尝试
grep-Eoz'pathX\n标题1:..\n标题2:...\n\n'