【问题标题】:sed/awk find a pattern and print everything before and after until another patternsed/awk 找到一个模式并打印之前和之后的所有内容,直到另一个模式
【发布时间】:2014-09-18 19:52:10
【问题描述】:

文件如下所示:

2014-09-18 01:00:00 some txt1 .....
...................................
...................................
2014-09-18 01:00:01 some txt2 .....
...................................
2014-09-18 01:00:02 some txt3 .....
...................................
.....my-pattern....................
...................................
2014-09-18 01:00:03 some txt4 .....
...................................

我需要在我的模式之前和之后打印每一行,直到第一次出现日期,所以之后它应该如下所示:

2014-09-18 01:00:02 some txt3 .....
...................................
.....my-pattern....................
...................................

有什么想法吗? :)

【问题讨论】:

  • 这和那个不太一样。当“记录”包含模式时,这需要完整的带有日期戳的“记录”。可以使用该链接问题中的那种答案,但需要累积行而不是将它们打印出来,并使用第二个状态标志在模式被命中时触发打印。

标签: bash awk sed


【解决方案1】:

使用gnu-awk 使得使用RS 和RT 变得非常简单:

awk -v RS='201[0-9]' '/my-pattern/ {print f $0} {f=RT}' file
2014-09-18 01:00:02 some txt3 .....
...................................
.....my-pattern....................
..................................

【讨论】:

    【解决方案2】:

    这样做:

    awk '/^2014/ {
                  if (f) {for (i=1;i<=var;i++) print data[i]}
                  {f=0; delete data; var=0}
                 }
         {data[++var]=$0}
         /my-pattern/ {f=1}
       ' file
    

    说明

    • /^2014/ {} #2014 年开始时,做...
    • if (f) {for (i=1;i&lt;=var;i++) print data[i]} 如果设置了标志,则打印存储的数据
    • {f=0; delete data; var=0} 为下一个块重置标志和数据存储
    • {data[++var]=$0} 存储每一行​​的所有数据
    • /my-pattern/ {f=1} 如果行包含我的模式,则设置标志

    测试

    $ awk '/^2014/ {if (f) {for (i=1;i<=var;i++) print data[i]} {f=0; delete data; var=0}} {data[++var]=$0} /my-pattern/ {f=1}' a
    2014-09-18 01:00:02 some txt3 .....
    ...................................
    .....my-pattern....................
    ...................................
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-24
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多