我需要过滤命令的输出。 我试过这个。
bpeek | grep nPDE
我的问题是我需要nPDE
的所有匹配项和找到的文件后面的行。所以输出就像:
iteration nPDE
1 1
iteration nPDE
2 4
最好的情况是,它只会向我显示找到的行一次,然后只显示它之后的行。
我用awk找到了解决方案,但据我所知,awk只能读取文件。
答案 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的评论中指出的那样,这既不可读也不容易扩展到更大量的上下文行,但对于一个上下文行正常工作。