grep - 如果包含一个单词而不是另一个单词的行在同一行中,则打印下一行10行

时间:2014-08-01 08:11:01

标签: bash awk sed grep

我有一个包含行的文件,如下所示:

some strings here class="batch2010" some more strings here click-here
<about 20-30lines here>
some strings here class="batch2006" some more strings here click-here
<about 20-30lines here>
some strings here class="NA" some more strings here click-here
<about 20-30lines here>
some strings here class="batch2010" some more strings here access-denied
<about 20-30lines here>

我想打印包含以下内容的行:

class="batch2010"

但不是:

access-denied

在同一行,然后打印文件中的下10行。

除了必须编写一个非常冗长且复杂的shell脚本之外,还有其他方法吗?

4 个答案:

答案 0 :(得分:2)

你可以尝试

< thefile grep -v 'access-denied' | grep -A10 'class="batch2010"'

答案 1 :(得分:2)

这可以是一个解决方案:

awk 'lines>0 {print; --lines}
     /ass="batch2010"/ && !/access-denied/ {lines=10}' file

请参阅输出(不太相关,因为行数不多):

$ awk '(lines>0) {print; --lines} /ass="batch2010"/ && !/access-denied/ {lines=10}' a
some strings here class="batch2006" some more strings here click-here
some strings here class="NA" some more strings here click-here
some strings here class="batch2010" some more strings here access-denied

它的逻辑基于How to print 5 consecutive lines after a pattern in file using awk添加我们匹配ass="batch2010"和&#34;不匹配&#34;的部分。 access-denied

测试

$ seq 30 > a
$ awk 'lines>0 {print; --lines} /4/ && !/14/ {lines=10}' a
5
6
7
8
9
10
11
12
13
14
25
26
27
28
29
30

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -n '/access-denied/b;/class="batch2010"/{:a;$!{N;s/\n/&/10;Ta};p}' file

如果行包含access-denied则退出,否则如果行包含class="batch2010",则在接下来的10行中读取并打印出来。

答案 3 :(得分:0)

此sed命令应该 用于非打印模式。
如果找到denied,则中断并跳转到sed语句的结尾 如果没有查找2010并打印下10行

sed -n '/denied/b;/2010/,+10p' file