从日志中,按行号使用 grep 提取特定行

从日志中,按行号使用 grep 提取特定行

我有一个文件debug.log,我想从中提取紧接在指定模式之前的所有行。

例子:

1 blabla
2 blabla
3 HERE THE IMPORTANT THING
4 HERE IT MATCHES MY PATTERN
5 blabla
6 ANOTHER IMPORTANT THING
7 PATTERN
5 blabla

预期结果:

HERE THE IMPORTANT THING
ANOTHER IMPORTANT THING

使用以下命令,我可以提取与我的模式匹配的行的行号

grep -n PATTERN debug.log |cut -f1 -d:

结果是

5
8

现在我想从每个数字中减一,并得到相应的行,如下所示:

sed -n 4p debug.log
sed -n 7p debug.log

这得到了我预期的结果。

我可以自动执行这个吗,这样我就不必sed像这样手动运行了?

答案1

这更简单并且仅使用grep

grep -B1 PATTERN debug.log | grep -v 'PATTERN\|--'

或者,

grep -B1 PATTERN debug.log | grep -v -e 'PATTERN' -e '--'

答案2

您可以单独使用 sed 来完成此操作:

sed -n -e '/PATTERN/{x;p;x};h'

在每一行上,如果模式匹配,则打印保留空间。无论如何,将当前行复制到保留空间中以供下一次迭代。

相关内容