Grep 如何快速查找丢失的行
我有一个包含以下方式记录的HTTP请求的文件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
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
工作原理
这告诉awk使用空行作为记录分隔符。这意味着每个请求(POST和header)都作为一条记录读入-vrs=
这会告诉awk打印任何包含/pathX/&&/标题3/
但不包含pathX
的记录header3
grep-Eoz'pathX\n标题1:..\n标题2:...\n\n'