10

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

假设pattern1(在文件中唯一) 匹配特定line # n并且pattern2 (在文件中不是唯一) 匹配.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
***************************************************************************

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

4

3 回答 3

23

这可以是一种方法:

$ awk '/pattern1/ {p=1}; p; /pattern2/ {p=0}' file
********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************
  • 当它找到 时pattern1,使变量 p=1。
  • 它只是在p==1. 这是通过p条件完成的。如果为真,则执行默认的 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
于 2013-10-04T09:29:32.080 回答
8

使用sed

$ sed '/start_pattern_here/,/end_pattern_here/!d' inputfile

在OP的具体情况下:

$ sed '/[*]* Results [*]*/,/^[*]*$/!d' inputfile
********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************

假设唯一模式是*** Results ***,非唯一模式是********

于 2013-10-04T09:38:55.740 回答
1

使用awk

awk '/Result/ {p=1;print;next}  /^\*\*\*\*\*/ && p {p=0;print} p' file
********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************
于 2013-10-04T09:32:13.547 回答