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

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

让我们说pattern1 (文件中唯一)匹配特定line # n pattern2pattern2 (不是唯一的文件)匹配line # m pattern2下一个立即匹配后行pattern2 。 然后我想提取包含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 *************************************************************************** 

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

Solutions Collecting From Web of "从文件中提取两个模式之间的行"

这可以是一种方法:

 $ 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 

使用sed

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

在OP的具体案例中:

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

假设独特的模式是*** Results ***和非唯一的一个是********

使用awk

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