我想显示匹配项之前的所有行,而不仅仅是 10、7 或 14,如中所述如何在 bash 中获取 grep 结果之前/之后的行?。
我该怎么做?匹配的行是否包含并不重要。
例如,而不是:
... | grep -B 10 -- "foo"
我想:
... | grep -B -- "foo"
但是最后的代码不起作用。
答案1
包括这场比赛在内,
sed '/foo/q' file
最好问
sed
一旦找到匹配项,则立即退出,否则sed
将继续读取文件并浪费时间,这对于大文件来说将是相当可观的。除了比赛之外,
sed -n '/foo/q;p' file
该
-n
标志表示只p
打印到达命令的行。由于该foo
行触发了q
uit 操作,因此它未到达p
,因此不会被打印。如果你
sed
是 GNU 的,这可以简化为sed '/foo/Q' file
参考
/foo/
—地址q
,p
—常用命令Q
—GNU Sed 扩展命令-n
—命令行选项
答案2
使用 GNU sed。打印所有行,从第一行到包含所需字符串的行。
sed '0,/foo/!d' file
答案3
以下是使用 的解决方案sed
,给定 file.txt 的内容:
bar
baz
moo
foo
loo
zoo
包含模式的命令
tac file.txt | sed -n '/foo/,$p' | tac
输出
bar
baz
moo
foo
排除模式
tac file.txt | sed -n -e '/foo/,$p' | tac | sed -n '/foo/!p'
bar
baz
moo
答案4
FreeBSD(包括MacOS)版本确实有这样的功能。
效果很好-B -1
,它显示文件开头匹配项之前的所有行。
... | grep -B -1 -- "foo"
同样-A -1
,它显示匹配之后到文件末尾的所有行。
... | grep -A -1 -- "foo"
对某些人来说可能有用,但它不适用于 Ubuntu 中包含的 GNU 实现。