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

时间:2013-10-04 09:25:46

标签: linux sed awk grep

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

假设pattern1(文件中唯一)与特定line # n匹配,而pattern2(文件中不唯一)与line # m匹配{{1}之后的下一个即时匹配}}。然后我想提取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
***************************************************************************

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

3 个答案:

答案 0 :(得分:19)

这可以是一种方法:

$ 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

答案 1 :(得分:7)

使用sed

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

在OP的具体案例中:

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

假设唯一模式为*** Results ***且非唯一模式为********

答案 2 :(得分:1)

使用awk

awk '/Result/ {p=1;print;next}  /^\*\*\*\*\*/ && p {p=0;print} p' file
********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************
相关问题