使用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的新手,这使我错过了一些显而易见的事情。
干杯。
答案 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