10

如何轻松地在匹配上方打印行并跳过匹配本身?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
4

3 回答 3

17
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匹配块之间打印的行和分隔符。

于 2013-07-30T09:55:48.153 回答
3

只需设置p为您想要的模式:

$ awk '$0~p{print a}{a=$0}' p="foo" file
bar
baz
foo
于 2013-07-30T10:01:20.007 回答
2
awk '/foo/{print a}{a=$0}' your_file
于 2013-07-30T10:06:06.593 回答