需要您的帮助
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**
我想 grep 数字 123456789,以及单词 ACK 或 OUT 两者(OR 条件);当找到两种模式时,则打印第 10 行单词“WAITING or CLEAR”。
我试过了
grep -ri "123456789" filepath | grep -ri "ACK\|OUT"
但这不会打印接下来的第 10 行内容。
这个漂亮的 sed 单行代码可以做到这一点:
sed -n '/123456789.*\(ACK\|OUT\)/{n;n;n;n;n;n;n;n;n;n;p}' infile
这假设在匹配行上,数字位于 ACK
或 OUT
之前。一旦一行与该模式匹配,该命令就会使用 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
和右大括号之间必须有一个额外的 ;
。
我是一名优秀的程序员,十分优秀!