我有一个巨大的日志文件,想从文件末尾搜索文本“exception thrown by :: ”,并从那里获取更多字符。基本上我只对最后一次出现感兴趣。
例如如果日志文件是这样的
一些数据异常由:: classA 引发一些文本异常由:: classBB 引发一些其他日志异常由:: classX 引发一些最近的日志异常
我想找到并打印 :: classX 引发的异常
请帮忙。
答案1
$TEXT
这将从日志中搜索您想要的文本data.txt
,显示匹配项前 X 行和匹配项后 Y 行。该tail
命令将过滤掉除最后一个匹配项之外的所有内容。命令中使用的数字tail
是 Z,Z = X + Y + 1
grep -BX -AY "$TEXT" data.txt | tail -Z
例如,如果你想要查找:: classX
,你想要查找前一行和后五行,那么你可以运行
grep -B1 -A5 ':: classX' data.txt | tail -7
附注:如果您想要第一个匹配项,您可以将其替换tail
为head
。如果您想查看所有匹配项,请删除该| tail -Z
部分。
您还可以添加颜色匹配grep --color
答案2
sed 解决方案
sed '/:: classX/h;$!d' logfile
sed 匹配模式并将该行放在保持缓冲区中,h
然后删除除最后一行之外的所有行$!d
。
答案3
试试这个。首先我们逐行反转文件,然后反转每一行。然后搜索“exception thrown by :: ”的反向,然后打印第一个匹配项。最后反转它。
tac logfile.txt | rev | grep -Po '\w+\s+::\s+yb\s+werht\s+noitpecxe' | head -1 | rev
这种方法特别适用于非常可能包含大文件非常长行是因为搜索是向后进行的,您不必遍历整个文件。