一尘不染

从文件中提取两个模式之间的行

linux

我需要从一个巨大的文件中提取两个匹配模式之间的特定行。

假设pattern1(文件中唯一)匹配特定内容line # npattern2 (文件中不唯一)匹配之后的line # m下一个立即匹配项line # n。然后我要提取之间的所有行,包括line #n to #m

样本文件内容

***************************************************************************
text line # n-2
text line # n-1
********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************
text line # m+1
text line # m+2
***************************************************************************

期望的输出

********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************

如果您能帮助我解决这个问题,将不胜感激


阅读 246

收藏
2020-06-02

共1个答案

一尘不染

这可以是一种方法:

$ awk '/pattern1/ {p=1}; p; /pattern2/ {p=0}' file
********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************
  • 找到时pattern1,则使变量p = 1。
  • 它仅在时打印行p==1。这是通过p条件完成的。如果为true,它将执行默认的awk操作,即print $0。否则,事实并非如此。
  • 找到时pattern2,则使变量p = 0。由于先后检查此条件p,它将打印pattern2第一次出现的行。

如果要精确匹配行:

$ awk '$0=="pattern1" {p=1}; p; $0=="pattern2" {p=0}' file

测试

$ cat a
***************************************************************************
text line # n-2
pattern1
********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************
pattern2
text line # m+2
pattern2
***************************************************************************
$ awk '/pattern1/ {p=1}; p; /pattern2/ {p=0}' a
pattern1
********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************
pattern2
2020-06-02