![从输出中删除 2 行,grep 匹配正则表达式加上下一个 1](https://linux22.com/image/553679/%E4%BB%8E%E8%BE%93%E5%87%BA%E4%B8%AD%E5%88%A0%E9%99%A4%202%20%E8%A1%8C%EF%BC%8Cgrep%20%E5%8C%B9%E9%85%8D%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8A%A0%E4%B8%8A%E4%B8%8B%E4%B8%80%E4%B8%AA%201.png)
我有一个来自 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