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

Jak*_* M. 8 awk grep

如何在比赛上方轻松打印线并跳过比赛本身?grep -A,-B-o选择不解决它.也许有些awk神奇?

例如:

$ cat foo.txt
bar
foo
baz
foo

$ cat foo.txt | grep foo-SOMETHING
bar
baz
Run Code Online (Sandbox Code Playgroud)

编辑

  • 如果第2行和第3行有"foo",那么应该打印第1行和第2行(虽然我这里不是很严格)

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

bar
foo
baz
foo
foo
Run Code Online (Sandbox Code Playgroud)

这应该理想地回归

bar
baz
foo
Run Code Online (Sandbox Code Playgroud)

Bar*_*mar 15

awk '!/foo/ { line = $0 }
     /foo/ { print line }' foo.txt
Run Code Online (Sandbox Code Playgroud)

第一个子句将每个非foo行保存在变量中.第二个子句在行匹配时打印最近保存的行foo.

这也有效(并处理foo连续两行的情况):

awk '/foo/ {print line}
     {line = $0}' foo.txt
Run Code Online (Sandbox Code Playgroud)

grep你可以做:

grep -B 1 foo foo.txt | grep -vE 'foo|^--$'
Run Code Online (Sandbox Code Playgroud)

第二个命令过滤掉foo匹配块之间打印的行和分隔符.