grep - 打印行之前,不要打印匹配

时间:2013-07-30 09:51:25

标签: awk grep

如何在比赛上方轻松打印线并跳过比赛本身? grep -A-B-o选项无法解决问题。也许有些awk魔法?

例如:

$ cat foo.txt
bar
foo
baz
foo

$ cat foo.txt | grep foo-SOMETHING
bar
baz

修改

  • 如果第2行和第3行有“foo”,则应打印第1行和第2行(虽然我在这里不是很严格)

附加功能:考虑以下示例:

bar
foo
baz
foo
foo

这应该理想地返回

bar
baz
foo

3 个答案:

答案 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