Linux 根据关键字查看大文件日志,grep: memory exhausted

2021-01-13 16:59:13 +08:00
 wuzhizuiguo
日志文件 10G,原来一直用 cat /root/logs/a.out |grep -C 10 "关键词", 日志文件小的时候很快, 刚想查一下,提示 grep: memory exhausted.
文件太大,下载到本地,notepad 也打不开.
想用 tail -n 50000 /root/logs/a.out |grep "关键字", 随着行数增加,还是找不到数据,最后也报了 memory exhausted
使用 less, 提示 may be a binary file. See it anyway? yes 乱码, 按网上设置后,还是打不开.
请教下大佬们 大日志文件, 根据关键词 怎么定位附近的日志?
5022 次点击
所在节点    Linux
38 条回复
calmzhu
2021-01-13 21:42:04 +08:00
5w 才 12m 。说明单行不大。或者大行未出现在后 5w 行。

wc -l a.out 如果能统计出行数。那么单行不至于超过内存错误。用 grep 贴出完整命令。如果仍然报内存错误。那很可能就是中间存在某些行特别大。

最省事的用 python/go 打开文件。不载入文件内容,而是手动控制偏移量进行没行计数。统计一下最大行的字符数。根据编码换算成字节大小。找到最大一行看看是不是过大。

如果是顺便加个查找功能,不一次读一行就行了。


或者用 dd 命令把文件切成 10 个约 1G 的再来 grep.这个不严谨,可能把超级行切断。但是可以试试看看结果再说
ETiV
2021-01-13 21:45:54 +08:00
先把 -C 参数去掉试试,保留上下文的话,内存占用肯定多

另外加一个 --line-buffered,遇到匹配的行就立即输出
helloworld000
2021-01-13 21:50:44 +08:00
用 vim 打开在 vim 里找?
AmitabhaPk
2021-01-13 21:56:55 +08:00
分成小块文件再检索不行么
Rache1
2021-01-13 22:03:03 +08:00
论日志采集平台的重要性
zlowly
2021-01-13 23:49:12 +08:00
如果是行超长,可以加多个管道 fold -w 4000 之类的强制换行,或者干脆 cut,tr 之类的强制行截取。
fuis
2021-01-14 00:18:54 +08:00
@wuzhizuiguo 相信我,UE 是看大日志最好用的,其他什么七七八八 vim fold dd 一概都是没看过大日志的
yzbythesea
2021-01-14 01:00:57 +08:00
论日志 Json 化重要性。
Meltdown
2021-01-14 02:42:34 +08:00
grep -a 试试
lvzhiqiang
2021-01-14 08:04:42 +08:00
将日志拆分吧,有拆分工具,split 。 或者如果格式化过的的话,要么就全部导入到 ELK 试试。
hanxiV2EX
2021-01-14 08:55:51 +08:00
应该从根源解决,日志文件按时间或大小进行拆分。
php8
2021-01-14 09:04:34 +08:00
@wangbenjun5 pipe 写入有容量控制,未读数据超出 buffer 大小写入会阻塞,先 cat 再 grep 多两次 memcpy,多用几 MB 内存,1000G 的文件也不会因此内存不够
wuzhizuiguo
2021-01-15 15:29:09 +08:00
好的,谢谢各位大佬的帮助. 现在选择了 不定时清理日志(体积小,但是以往的结果就不能查了... 也怕几个日志大了 空间不够了)
最终汇总下.
小日志文件, 查看末尾几行 tail -n 500 /root/logs/a.out;
有关键词时, cat /root/logs/a.out |grep -C 10 "关键字" , 定位"关键字"上下 10 行内容 (文件大时,grep: memory exhausted)
或者 grep -C 10 "关键字" /root/logs/a.out (遇到我这种有超长行的, 也会 memory exhausted)
坛友提到的 vim 打开, 这个我在其他帖子看到, 大文件也不能这样做.
如果是 末行几行, 例如 几万行内(从时间推算), 可以用 tail -n 30000 /root/logs/a.out > tmp.out 去截取日志, 变小了,然后再去查询关键字. (行数太大,也会报错)
tar 把文件下载回来, 用 UltraEdit 查看(不过太大了 下载也是个问题..,生成的日志 UltraEdit 中文乱码 )
或者分割文件, 变小了再查看.
日志可以按时间分开,每天一个文件等.
pyu77
2021-01-16 11:56:46 +08:00
sed -n '/2019-10-15 10:[0-9][0-9]:[0-9][0-9]/,/2019-10-15 11:[0-9][0-9]:[0-9][0-9]/'p server.log >/app/jboss/jboss-5.1.0.GA/server/ngr/log/20191015.log
sed -n '/2020-12-09 02:[0-9][0-9]:[0-9][0-9]/,/2020-12-09 03:[0-9][0-9]:[0-9][0-9]/'p server.log >20201209server2.log
我遇到大日志都是直接取时间区间拷贝下来看,不知道楼主能不能用上
wuzhizuiguo
2021-01-18 09:48:59 +08:00
@jaliemoon 以后可能用得着 现在我们日志基本不带时间...
grep -C 10 "关键字" /root/logs/a.out 可能会报 Binary file matches, 用 grep -a "关键字" /root/logs/a.out , 如果再想查询上下 N 行(10 行), grep -aC 10 "关键字" /root/logs/a.out
aibangjuxin
2021-01-19 12:00:28 +08:00
logrotate 研究下。另外不要 cat 直接 grep 好几层都给这么回复的。
aibangjuxin
2021-01-19 12:07:09 +08:00
印象中好像 fgrep 比 grep 快点 匹配规则不一样。
wuzhizuiguo
2021-01-22 13:50:13 +08:00
@aibangjuxin 大佬强啊, fgrep 没有报 "grep: memory exhausted"

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/744616

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX