有没有办法获得 grep -v 和 grep -A 结合的效果?

有没有办法获得 grep -v 和 grep -A 结合的效果?

有没有办法,或者用grep其他东西,(实际上)组合grep -vand grep -A?也就是说,而不是包括字符串后 x 行的所有内容,排除一切。

快速提醒那些忘记 grep 开关的人:
cat file.txt | grep -v blah 过滤掉 'blah',与普通 grep 相反,
cat file.txt | grep -A7 foo 每次出现 'foo' 后将显示 7 行
(是的,我知道cat这里没有必要。但我发现它更具可读性当你把很多grep语句串在一起来这样做时。)

光是说是
cat file.txt | grep -A100 bar | grep -vA100 foo
不行的。 “Working”将被定义为显示匹配“bar”的行和匹配“foo”的行之间的所有内容(最多 100 行)。

答案1

有一种简单的方法可以使用sed提取从 abar到 a 的所有块:foo

sed -n '/bar/,/foo/p'

或使用 awk:

awk '/bar/, /foo/'

如果你想截断块,那就有点复杂了(在 awk 中;在 sed 中则复杂得多)。这是一个解决方案:

awk -vmax_lines_per_chunk=100 '
    /bar/ {n=max_lines_per_chunk}
    /foo/ {if (n) print; n=0}
    n {--n; print}
'

相关内容