有没有办法,或者用grep
其他东西,(实际上)组合grep -v
and 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}
'