我想过滤包含“模式”的行和以下5行。
类似于grep -v -A 5 'pattern' myfile.txt
的输出:
other
other
other
other
other
other
我对linux shell解决方案,grep,awk,sed感兴趣... 谢谢
myfile.txt:
other
other
other
pattern
follow1
follow2
follow3
follow4
follow5
other
other
other
pattern
follow1
follow2
follow3
follow4
follow5
other
other
other
other
other
other
答案 0 :(得分:4)
您可以使用awk
:
awk '/pattern/{c=5;next} !(c&&c--)' file
基本上:我们在输入的每一行上减少整数c
。当c
为0
时,我们正在打印行。 *(请参阅下文)注意:c
会在首次使用时由awk自动用0
初始化。
找到单词pattern
时,我们将c
设置为5
,这会使c--<=0
的5行为假,而awk无法打印这些行。
*我们可以基本上使用c--<=0
来检查c
是否小于或等于0
。但是,当单词pattern
的出现之间有很多行(!)时,c
可能会溢出。为了避免这种情况,oguz ismail建议实施如下检查:
!(c&&c--)
这将检查c
是否为真(大于零),然后才减小c
。 c
将永远不会小于0
,因此不会溢出。这张支票!(...)
的反转使awk
打印正确的行。
旁注:通常,如果要表示正则表达式而不是regexp
,则应使用pattern
一词。
答案 1 :(得分:2)
使用GNU sed
(应该可以,因为OP提到了Linux
)
sed '/pattern/,+5d' ip.txt
删除与给定正则表达式匹配的行和其后的5行
答案 2 :(得分:0)
我是用这个做的:
head -$(wc -l myfile.txt | awk '{print $1-5 }') myfile.txt | grep -v "whatever"
这意味着:
wc -l myfile.txt : how many lines (but it also shows the filename)
awk '{print $1}' : only show the amount of lines
awk '{print $1-5 }' : we don't want the last five lines
head ... : show the first ... lines (which means, leave out the last five)
grep -v "..." : this part you know :-)