我需要从一个巨大的文件中提取两个匹配模式之间的特定行。
假设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
***************************************************************************
如果你能帮我解决这个问题,我们将不胜感激
答案 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
***************************************************************************