1
Jooooooooo 2021-01-13 17:02:01 +08:00
直接 grep
不要 cat grep '关键词' 文件 |
2
wuzhizuiguo OP @Jooooooooo 还是... grep: memory exhausted
|
3
wangbenjun5 2021-01-13 17:05:56 +08:00
1 楼正解,你用 cat 相当于要把所有数据载入到内存里面,除非你的机器有 10G 的内存,直接 grep 就可
|
4
SuperManNoPain 2021-01-13 17:10:09 +08:00
你要是下载到本地, 本地机器配置可以的话, windows 可以用 gitbash 进行 less 或者 grep 操作, 曲线救国吧,
|
5
wuzhizuiguo OP @SuperManNoPain 文件太大了(比下动作片还慢),本地也没有 10G 内存 会影响查看吗? (后面实在不行我准备试试)
|
6
Jirajine 2021-01-13 17:16:20 +08:00 via Android
@wuzhizuiguo grep/ripgrep 都是流式操作的,多大的文件也不会占很多内存。
|
7
dajj 2021-01-13 17:16:26 +08:00 1
还是命令行用的不对。 grep 不熟练
# 查找关键词所在行及其上下各 10 行的内容 grep 关键词 -B 10 -A 10 文件 | tee r.txt |
8
xuboying 2021-01-13 17:16:37 +08:00 via Android
怀疑文件内某些行巨长,导致一行一行读也超载了。
|
9
Lee2019 2021-01-13 17:16:46 +08:00
grep 我记得是按行读的,原则上不会有这个问题
难道是你的日志某些行特别大吗? ulimit -a 看看是不是限制的内存太小,适当放大一些再试试 |
10
wuzhizuiguo OP @dajj 还是不行.. grep: memory exhausted
|
11
wuzhizuiguo OP @xuboying 对,是有很长的一行(多行)
|
12
wuzhizuiguo OP @Lee2019
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 127979 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 65535 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 127979 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited |
13
dajj 2021-01-13 17:39:31 +08:00
@wuzhizuiguo 那就到达我知识的盲区了
|
14
lululau 2021-01-13 17:46:18 +08:00
3L 瞎说,6L 正解
估计是有些行太太太长了 |
15
fuis 2021-01-13 18:36:53 +08:00 1
个人建议日志 tar 下载回来,用 UltraEdit 查看。
|
16
privil 2021-01-13 18:45:07 +08:00 1
论日志截断的重要性。
|
17
liuxu 2021-01-13 20:32:47 +08:00
tail -n 50000 > tmp.log
看看你的 50000 有多大 |
18
wuzhizuiguo OP @liuxu 50000 12.23MB
|
19
wuzhizuiguo OP @fuis 准备日志去掉不必要的长数据行, 部分缺少的参数 加到阿里云日志里去. 下载使用 UltraEdit. grep 也确实不怎么用过..
|
20
liuxu 2021-01-13 20:52:00 +08:00
@wuzhizuiguo 12MB 不至于会出问题,在 grep xxx tmp.log 看看会不会报错
|
21
calmzhu 2021-01-13 21:42:04 +08:00 via Android 1
5w 才 12m 。说明单行不大。或者大行未出现在后 5w 行。
wc -l a.out 如果能统计出行数。那么单行不至于超过内存错误。用 grep 贴出完整命令。如果仍然报内存错误。那很可能就是中间存在某些行特别大。 最省事的用 python/go 打开文件。不载入文件内容,而是手动控制偏移量进行没行计数。统计一下最大行的字符数。根据编码换算成字节大小。找到最大一行看看是不是过大。 如果是顺便加个查找功能,不一次读一行就行了。 或者用 dd 命令把文件切成 10 个约 1G 的再来 grep.这个不严谨,可能把超级行切断。但是可以试试看看结果再说 |
22
ETiV 2021-01-13 21:45:54 +08:00
先把 -C 参数去掉试试,保留上下文的话,内存占用肯定多
另外加一个 --line-buffered,遇到匹配的行就立即输出 |
23
helloworld000 2021-01-13 21:50:44 +08:00
用 vim 打开在 vim 里找?
|
24
AmitabhaPk 2021-01-13 21:56:55 +08:00
分成小块文件再检索不行么
|
25
Rache1 2021-01-13 22:03:03 +08:00
论日志采集平台的重要性
|
26
zlowly 2021-01-13 23:49:12 +08:00
如果是行超长,可以加多个管道 fold -w 4000 之类的强制换行,或者干脆 cut,tr 之类的强制行截取。
|
27
fuis 2021-01-14 00:18:54 +08:00
@wuzhizuiguo 相信我,UE 是看大日志最好用的,其他什么七七八八 vim fold dd 一概都是没看过大日志的
|
28
yzbythesea 2021-01-14 01:00:57 +08:00
论日志 Json 化重要性。
|
29
Meltdown 2021-01-14 02:42:34 +08:00 via Android
grep -a 试试
|
30
lvzhiqiang 2021-01-14 08:04:42 +08:00
将日志拆分吧,有拆分工具,split 。 或者如果格式化过的的话,要么就全部导入到 ELK 试试。
|
31
hanxiV2EX 2021-01-14 08:55:51 +08:00 via Android
应该从根源解决,日志文件按时间或大小进行拆分。
|
32
php8 2021-01-14 09:04:34 +08:00 via Android
@wangbenjun5 pipe 写入有容量控制,未读数据超出 buffer 大小写入会阻塞,先 cat 再 grep 多两次 memcpy,多用几 MB 内存,1000G 的文件也不会因此内存不够
|
33
wuzhizuiguo OP 好的,谢谢各位大佬的帮助. 现在选择了 不定时清理日志(体积小,但是以往的结果就不能查了... 也怕几个日志大了 空间不够了)
最终汇总下. 小日志文件, 查看末尾几行 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 中文乱码 ) 或者分割文件, 变小了再查看. 日志可以按时间分开,每天一个文件等. |
34
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 我遇到大日志都是直接取时间区间拷贝下来看,不知道楼主能不能用上 |
35
wuzhizuiguo OP @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 |
36
aibangjuxin 2021-01-19 12:00:28 +08:00
logrotate 研究下。另外不要 cat 直接 grep 好几层都给这么回复的。
|
37
aibangjuxin 2021-01-19 12:07:09 +08:00 1
印象中好像 fgrep 比 grep 快点 匹配规则不一样。
|
38
wuzhizuiguo OP @aibangjuxin 大佬强啊, fgrep 没有报 "grep: memory exhausted"
|