【问题标题】:Using awk to get lines between two patterns使用 awk 获取两个模式之间的线条
【发布时间】:2019-09-28 17:17:59
【问题描述】:

新手使用 awk 并尝试编写一个 bash 脚本来使用它来打印日志文件中两个模式之间的行,而对于我来说,我无法让它工作。

我想我需要转义一些字符。

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

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

我想要“处理中...”行(第一个模式)和“发送”行(第二个模式)之间的四行,并且日志的只有一个部分具有上述部分和第一个部分图案线和第二条图案线。

我已经尝试使用 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 的新手导致我错过了一些明显的东西。

干杯。

【问题讨论】:

标签: bash awk


【解决方案1】:

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

$ 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

【讨论】:

  • @David 不,awk 也支持/start/,/stop/,但是对于在分隔符之间使用文本块做某事的问题,它是一个较差的解决方案。 sed 坚持使用它,因为 sed 没有变量,因此您无法设置标志变量以使用更好的方法,但 awk 确实有变量,因此可以做得更好。在这种情况下,例如,您不必再次测试边界条件以将它们从输出中排除。尝试使用/start/,/stop/ 方法。
  • 谢谢 Ed,我被抛出了一个循环,直到我查看了你的表达顺序和行的顺序。我真的很想知道“现在他到底做了什么......”。你的权利,使用/start/,/stop/,你将需要另一个模式!{stop}{d}
  • 是的,您使用顺序来控制打印哪些分隔符(如果有)。 /s/,/e/ 在功能上等同于 /s/{f=1} f; /e/{f=0} 并打印两个定界线,但使用标志版本,您可以简单地打乱部分以仅打印开始分隔符 /s/{f=1} /e/{f=0} f; 或仅打印结束分隔符 f; /s/{f=1} /e/{f=0} 或两者都不打印 @987654331 @(即上述情况)。使用范围表达式版本,您必须开始为您已经在范围表达式中测试过的内容嵌入额外的测试,或者放弃并完全重写它。
  • 还有一些边缘情况需要考虑,其中分隔符彼此出现在同一行 - 使用标志解决方案也可以轻松处理,而使用范围表达式则很糟糕。
  • 在我捕捉到它是什么之后,它的工作原理是显而易见的,但没有使用 awk 进行块打印,这是一个非常好的方法,我不会只是想出来蓝色。
猜你喜欢
  • 2023-01-13
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 2013-08-21
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多