从输出中删除 2 行,grep 匹配正则表达式加上下一个 1

从输出中删除 2 行,grep 匹配正则表达式加上下一个 1

我有一个来自 postgresql 的日志文件,其中包含以下格式的日志条目;

LOG:  execute <unnamed>: /match this here/
DETAIL:  parameters: /also want to filter this line/

我认为

grep -v --after-context=1 'match this here' /my/log/file.log

但它不起作用。是否有一些 sed/awk/grep 魔法,或者我必须做一些 perl?

答案1

据我所知,你不能单独用 grep 来做到这一点。awk
可以很简单地做到这一点:

awk -v skip=-1 '/match this here/ { skip = 1 } skip-- >= 0 {next } 1' /my/log/file.log

编辑:
我假设您无法通过任何正则表达式匹配第二行,并且您确实想匹配包含 X 的行以及其后的行。如果您可以匹配字符串,那就容易多了:

egrep -v "match this here|also want to filter this line" /my/log/file.log

答案2

使用 awk 的另一种方法:

awk '/match this here/ {getline; next} {print}' file.log

答案3

您是否打算使用“-v”来阻止“匹配此处”显示第一行?“-v”将您的表达式反转为“显示与‘匹配此处’不匹配的行”。我现在不在 *nix 机器上,但我认为如果您只想显示第二行,您可以这样做:

grep --after-context=1 'match this here' /my/log/file.log | grep -v '^LOG:' | grep -v '^-'

这应该打印两行,但第二个 grep 语句应该隐藏以 LOG 开头的第一行:

尝试一下,祝你好运。

答案4

日志:执行:/在此处匹配/详细信息:参数:/还想过滤此行/

STR='匹配此处' FILE=/var/log/logfile.log

sed "/$STR/{n;d;}" $FILE | sed /$STR/d

相关内容