我有一个包含行的文件,如下所示:
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脚本之外,还有其他方法吗?
答案 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