grep -v多行同时

时间:2019-05-13 08:37:10

标签: awk grep

我想过滤包含“模式”的行以下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

3 个答案:

答案 0 :(得分:4)

您可以使用awk

awk '/pattern/{c=5;next} !(c&&c--)' file

基本上:我们在输入的每一行上减少整数c。当c0时,我们正在打印行。 *(请参阅下文)注意:c会在首次使用时由awk自动用0初始化。

找到单词pattern时,我们将c设置为5,这会使c--<=0的5行为假,而awk无法打印这些行。


*我们可以基本上使用c--<=0来检查c是否小于或等于0。但是,当单词pattern的出现之间有很多行(!)时,c可能会溢出。为了避免这种情况,oguz ismail建议实施如下检查:

!(c&&c--)

这将检查c是否为(大于零),然后才减小cc将永远不会小于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 :-)