使用awk获取两个模式之间的线

时间:2019-05-10 19:19:00

标签: bash awk

使用awk的新手,并试图编写一个bash脚本来使用它在日志文件中的两个模式之间打印行,并且对我而言,我无法使其正常工作。

我想我需要逃脱一些角色。

这是我要从中获取行的日志部分的示例:

Processing... AP710  (/var/opt/testsys/rptprint/AP710)
sidjosajdois
sokds3488sds
doskdoskdoskdo
sodk229929
sending entire report to Job Mgr (spool) for user

我想要“ Processing ...”行(第一个模式)和“ sending”行(第二个模式)之间的四行,并且日志中只有一个部分具有上面的这一部分,而第一部分和第二部分图案线和第二图案线。

我尝试通过以下命令使用awk并使用第一个模式的一部分,并根据需要转义“ /”字符:

awk '/\/var\/opt\/testsys\/rptprint\/AP710/{flag=1;next}/sending entire report to Job Mgr/{flag=0}flag' log 

但是它给了我日志的其他不同部分,也恰好具有路径“ / var / opt / testsys / rptprint / AP710”,因此我尝试将其更改为具有更多行(第一个模式)通过添加“正在处理...”,它不会返回任何内容。...

awk '/Processing\.\.\. AP710 \(\/var\/opt\/testsys\/rptprint\/AP710/{flag=1;next}/sending entire report to Job Mgr/{flag=0}flag' log

有人可以提供有关awk的一些指导,以便我可以了解两种模式之间的界线吗?花了几个小时后,我开始疯狂地尝试解决这个问题,我认为我是awk的新手,这使我错过了一些显而易见的事情。

干杯。

1 个答案:

答案 0 :(得分:3)

每当您发现自己在正则表达式中转义字符以使它们成为文字时,请真正考虑是否应该使用正则表达式,或者是否应该进行字符串比较。实际上,如果您需要,总是从字符串比较开始,然后切换到regexp。

$ awk '
    $0=="sending entire report to Job Mgr (spool) for user" { inSection=0 }
    inSection;
    $0=="Processing... AP710  (/var/opt/testsys/rptprint/AP710)" { inSection=1 }
' file
sidjosajdois
sokds3488sds
doskdoskdoskdo
sodk229929