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

Linux 从文件中提取两个模式之间的行,linux,sed,awk,grep,Linux,Sed,Awk,Grep,我需要从一个大文件中提取两个匹配模式之间的特定行 假设pattern1(在文件中是唯一的)匹配特定的行n,而pattern2(在文件中不是唯一的)匹配line#m在行n之后的下一个立即匹配。然后,我想提取介于和包括line#n到#m 示例文件内容 *************************************************************************** text line # n-2 text line # n-1 ******************

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

假设
pattern1
(在文件中是唯一的)匹配特定的
行n
,而
pattern2
(在文件中不是唯一的)匹配
line#m
行n
之后的下一个立即匹配。然后,我想提取介于和包括
line#n到#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
***************************************************************************

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

这可能是一种方法:

$ awk '/pattern1/ {p=1}; p; /pattern2/ {p=0}' file
********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************
  • 当它找到
    pattern1
    时,则使变量p=1
  • 当p==1时,它只打印行。这是在
    p
    条件下完成的。如果为true,则执行默认的awk操作,即打印$0。否则,它不会
  • 当它找到
    pattern2
    时,则使变量p=0。由于在
    p
    条件后检查此条件,它将打印第一次出现
    pattern2
    的行
如果您希望线条完全匹配:

$ awk '$0=="pattern1" {p=1}; p; $0=="pattern2" {p=0}' file
试验 使用
awk

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

使用
sed

$ sed '/start_pattern_here/,/end_pattern_here/!d' inputfile
在OP的具体案例中:

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

假设唯一模式为
***结果***
,非唯一模式为
*********

,谢谢您的回复。但我无法匹配第n-1行和第m+1行。它们不是deterministic@jkshah哦,现在我明白了。检查我的最新答案。我考虑到您正在寻找模式1的事实,请参见test.updated ans排除了线#n和#m,这是不需要的。你能检查一下吗?您的解决方案似乎符合@Jotne的建议,并且效果良好。它不排除第n行和第m行。这个解决方案为您寻找特定的模式1和模式2提供了一个更通用的方法。现在,这是完美和简洁的。谢谢!谢谢你的回复。这很好用。@devnull,你认为这个解决方案比awk解决方案更可取吗?如果是,你能解释一下原因吗?谢谢你的回答。这很好。我将这个问题标记为我打开的问题的副本,以涵盖所有案例。这样,我们就有了一个很好的解释这个主题的主要地方。
$ sed '/[*]* Results [*]*/,/^[*]*$/!d' inputfile
********************************* Results *********************************
SUCCEEDED
...
...
some text
***************************************************************************