sed / awk找到一个模式并打印前后的所有内容,直到另一个模式

时间:2014-09-18 11:19:52

标签: bash awk sed

文件如下所示:

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 .....
...................................

我需要打印my-pattern之前和之后的每一行UNTIL第一次出现的日期,所以它应该如下所示:

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

有什么想法吗? :)

2 个答案:

答案 0 :(得分:3)

使用gnu-awk可以使用RSRT非常直接:

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

答案 1 :(得分:0)

这样做:

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/ {} #when行于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}如果line包含my-pattern,请在
  • 上设置标志

测试

$ 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....................
...................................