仅输出第一个图案线及其后续行

时间:2017-05-11 11:28:17

标签: linux bash awk grep

我需要过滤命令的输出。 我试过这个。

bpeek | grep nPDE

我的问题是我需要nPDE的所有匹配项和找到的文件后面的行。所以输出就像:

iteration nPDE
1         1
iteration nPDE
2         4

最好的情况是,它只会向我显示找到的行一次,然后只显示它之后的行。

我用awk找到了解决方案,但据我所知,awk只能读取文件。

2 个答案:

答案 0 :(得分:2)

有一个选项。

grep --help
...
  -A, --after-context=NUM   print NUM lines of trailing context

因此:

bpeek | grep -A 1 'nPDE'

答案 1 :(得分:0)

grep -A如果你的grep支持它(它不在POSIX grep中)。如果没有,您可以使用sed:

bpeek | sed '/nPDE/!d;N'

执行以下操作:

/nPDE/!d # If the line doesn't match "nPDE", delete it (starts new cycle)
N        # Else, append next line and print them both

请注意,这将无法打印此文件的正确输出

nPDE
nPDE
context line

如果你有GNU sed,你可以使用如下地址范围:

sed '/nPDE/,+1!d'

格式addr1,+N的地址定义 addr1 (在我们的案例中为/nPDE/)和以下 N <之间的范围/ em>行。此解决方案更容易适应不同数量的上下文行,但仍然无法通过上述示例。

管理

等案例的解决方案
blah
nPDE
context
blah
blah
nPDE
nPDE
context
nPDE

想要

sed -n '/nPDE/{$p;:a;N;/\n[^\n]*nPDE[^\n]*$/!{p;b};ba}'

执行以下操作:

/nPDE/ {                       # If the line matches "nPDE"
    $p                         # If we're on the last line, just print it
    :a                         # Label to jump to
    N                          # Append next line to pattern space
    /\n[^\n]*nPDE[^\n]*$/! {   # If appended line does not contain "nPDE"
        p                      # Print pattern space
        b                      # Branch to end (start new loop)
    }
    ba                         # Branch to label (appended line contained "nPDE")
}

由于-n选项,不会打印所有其他行。

正如Ed的评论中指出的那样,这既不可读也不容易扩展到更大量的上下文行,但对于一个上下文行正常工作。