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
***************************************************************************
- 当它找到
时,则使变量p=1pattern1
- 当p==1时,它只打印行。这是在
条件下完成的。如果为true,则执行默认的awk操作,即打印$0。否则,它不会p
- 当它找到
时,则使变量p=0。由于在pattern2
条件后检查此条件,它将打印第一次出现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
***************************************************************************