在OR条件下grep 2个单词和下一个10行打印

时间:2016-03-31 01:10:04

标签: linux unix grep

需要你的帮助

2016/03/31 07:00:00 ----- [200]  Number **123456789**  word **ACK**
.
.
10th Line
            **WAITING**

2016/03/31 07:00:00 ----- [200]  Number **123456789**  word **OUT**
.
.
10th Line
            **CLEAR**

我想要输入数字123456789,以及单词ACK或OUT(OR条件);当找到两个模式时,然后打印第10个单词“WAITING或CLEAR”。

我试过

grep -ri "123456789" filepath | grep -ri "ACK\|OUT" 

但是这不会打印下一个第10行内容。

1 个答案:

答案 0 :(得分:1)

这个漂亮的 sed one-liner可以做到:

sed -n '/123456789.*\(ACK\|OUT\)/{n;n;n;n;n;n;n;n;n;n;p}' infile

这假设在匹配行上,该数字位于ACKOUT之前。一旦一行与该模式匹配,该命令将使用n将下一行加载10次,然后使用p打印模式空间。由于-n选项,不会打印所有其他行。

对于看起来像

的输入文件
2016/03/31 07:00:00 ----- [200]  Number **123456789**  word **ACK**
1
2
3
4
5
6
7
8
9
10th line after ACK
blah
blah
2016/03/31 07:00:00 ----- [200]  Number **123456789**  word **OUT**
1
2
3
4
5
6
7
8
9
10th line after OUT

结果是

$ sed -n '/123456789.*\(ACK\|OUT\)/{n;n;n;n;n;n;n;n;n;n;p}' infile
10th line after ACK
10th line after OUT

要使用BSD sed运行(在Mac OS中使用),;和右括号之间必须有一个额外的p