如何在比赛上方轻松打印线并跳过比赛本身? grep
-A
,-B
和-o
选项无法解决问题。也许有些awk
魔法?
例如:
$ cat foo.txt
bar
foo
baz
foo
$ cat foo.txt | grep foo-SOMETHING
bar
baz
修改
附加功能:考虑以下示例:
bar
foo
baz
foo
foo
这应该理想地返回
bar
baz
foo
答案 0 :(得分:14)
awk '!/foo/ { line = $0 }
/foo/ { print line }' foo.txt
第一个子句将每个非foo行保存在变量中。当行匹配foo
时,第二个子句打印最近保存的行。
这也有效(并处理连续两行foo
行的情况):
awk '/foo/ {print line}
{line = $0}' foo.txt
使用grep
即可:
grep -B 1 foo foo.txt | grep -vE 'foo|^--$'
第二个命令过滤掉foo
行和匹配块之间打印的分隔符。
答案 1 :(得分:2)
只需将p
设置为您想要的模式:
$ awk '$0~p{print a}{a=$0}' p="foo" file
bar
baz
foo
答案 2 :(得分:1)
awk '/foo/{print a}{a=$0}' your_file