Linux 根据关键字查看大文件日志,grep: memory exhausted - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wuzhizuiguo
V2EX    Linux

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

  •  
  •   wuzhizuiguo 2021 年 1 月 13 日 6072 次点击
    这是一个创建于 1864 天前的主题,其中的信息可能已经有所发展或是发生改变。
    日志文件 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 乱码, 按网上设置后,还是打不开.
    请教下大佬们 大日志文件, 根据关键词 怎么定位附近的日志?
    38 条回复    2021-01-22 13:50:13 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2021 年 1 月 13 日
    直接 grep

    不要 cat

    grep '关键词' 文件
    wuzhizuiguo
        2
    wuzhizuiguo  
    OP
       2021 年 1 月 13 日
    @Jooooooooo 还是... grep: memory exhausted
    wangbenjun5
        3
    wangbenjun5  
       2021 年 1 月 13 日
    1 楼正解,你用 cat 相当于要把所有数据载入到内存里面,除非你的机器有 10G 的内存,直接 grep 就可
    SuperManNoPain
        4
    SuperManNoPain  
       2021 年 1 月 13 日
    你要是下载到本地, 本地机器配置可以的话, windows 可以用 gitbash 进行 less 或者 grep 操作, 曲线救国吧,
    wuzhizuiguo
        5
    wuzhizuiguo  
    OP
       2021 年 1 月 13 日
    @SuperManNoPain 文件太大了(比下动作片还慢),本地也没有 10G 内存 会影响查看吗? (后面实在不行我准备试试)
    Jirajine
        6
    Jirajine  
       2021 年 1 月 13 日 via Android
    @wuzhizuiguo grep/ripgrep 都是流式操作的,多大的文件也不会占很多内存。
    dajj
        7
    dajj  
       2021 年 1 月 13 日   1
    还是命令行用的不对。 grep 不熟练

    # 查找关键词所在行及其上下各 10 行的内容
    grep 关键词 -B 10 -A 10 文件 | tee r.txt
    xuboying
        8
    xuboying  
       2021 年 1 月 13 日 via Android
    怀疑文件内某些行巨长,导致一行一行读也超载了。
    Lee2019
        9
    Lee2019  
       2021 年 1 月 13 日
    grep 我记得是按行读的,原则上不会有这个问题
    难道是你的日志某些行特别大吗?
    ulimit -a 看看是不是限制的内存太小,适当放大一些再试试
    wuzhizuiguo
        10
    wuzhizuiguo  
    OP
       2021 年 1 月 13 日
    @dajj 还是不行.. grep: memory exhausted
    wuzhizuiguo
        11
    wuzhizuiguo  
    OP
       2021 年 1 月 13 日
    @xuboying 对,是有很长的一行(多行)
    wuzhizuiguo
        12
    wuzhizuiguo  
    OP
       2021 年 1 月 13 日
    @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
    dajj
        13
    dajj  
       2021 年 1 月 13 日
    @wuzhizuiguo 那就到达我知识的盲区了
    lululau
        14
    lululau  
       2021 年 1 月 13 日
    3L 瞎说,6L 正解

    估计是有些行太太太长了
    fuis
        15
    fuis  
       2021 年 1 月 13 日   1
    个人建议日志 tar 下载回来,用 UltraEdit 查看。
    privil
        16
    privil  
       2021 年 1 月 13 日   1
    论日志截断的重要性。
    liuxu
        17
    liuxu  
       2021 年 1 月 13 日
    tail -n 50000 > tmp.log

    看看你的 50000 有多大
    wuzhizuiguo
        18
    wuzhizuiguo  
    OP
       2021 年 1 月 13 日
    @liuxu 50000 12.23MB
    wuzhizuiguo
        19
    wuzhizuiguo  
    OP
       2021 年 1 月 13 日
    @fuis 准备日志去掉不必要的长数据行, 部分缺少的参数 加到阿里云日志里去. 下载使用 UltraEdit. grep 也确实不怎么用过..
    liuxu
        20
    liuxu  
       2021 年 1 月 13 日
    @wuzhizuiguo 12MB 不至于会出问题,在 grep xxx tmp.log 看看会不会报错
    calmzhu
        21
    calmzhu  
       2021 年 1 月 13 日 via Android   1
    5w 才 12m 。说明单行不大。或者大行未出现在后 5w 行。

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

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

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


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

    另外加一个 --line-buffered,遇到匹配的行就立即输出
    helloworld000
        23
    helloworld000  
       2021 年 1 月 13 日
    用 vim 打开在 vim 里找?
    AmitabhaPk
        24
    AmitabhaPk  
       2021 年 1 月 13 日
    分成小块文件再检索不行么
    Rache1
        25
    Rache1  
       2021 年 1 月 13 日
    论日志采集平台的重要性
    zlowly
        26
    zlowly  
       2021 年 1 月 13 日
    如果是行超长,可以加多个管道 fold -w 4000 之类的强制换行,或者干脆 cut,tr 之类的强制行截取。
    fuis
        27
    fuis  
       2021 年 1 月 14 日
    @wuzhizuiguo 相信我,UE 是看大日志最好用的,其他什么七七八八 vim fold dd 一概都是没看过大日志的
    yzbythesea
        28
    yzbythesea  
       2021 年 1 月 1 日
    论日志 Json 化重要性。
    Meltdown
        29
    Meltdown  
       2021 年 1 月 14 日 via Android
    grep -a 试试
    lvzhiqiang
        30
    lvzhiqiang  
       2021 年 1 月 14 日
    将日志拆分吧,有拆分工具,split 。 或者如果格式化过的的话,要么就全部导入到 ELK 试试。
    hanxiV2EX
        31
    hanxiV2EX  
       2021 年 1 月 14 日 via Android
    应该从根源解决,日志文件按时间或大小进行拆分。
    php8
        32
    php8  
       2021 年 1 月 14 日 via Android
    @wangbenjun5 pipe 写入有容量控制,未读数据超出 buffer 大小写入会阻塞,先 cat 再 grep 多两次 memcpy,多用几 MB 内存,1000G 的文件也不会因此内存不够
    wuzhizuiguo
        33
    wuzhizuiguo  
    OP
       2021 年 1 月 15 日
    好的,谢谢各位大佬的帮助. 现在选择了 不定时清理日志(体积小,但是以往的结果就不能查了... 也怕几个日志大了 空间不够了)
    最终汇总下.
    小日志文件, 查看末尾几行 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
        34
    pyu77  
       2021 年 1 月 16 日
    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
        35
    wuzhizuiguo  
    OP
       2021 年 1 月 18 日
    @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
        36
    aibangjuxin  
       2021 年 1 月 19 日
    logrotate 研究下。另外不要 cat 直接 grep 好几层都给这么回复的。
    aibangjuxin
        37
    aibangjuxin  
       2021 年 1 月 19 日   1
    印象中好像 fgrep 比 grep 快点 匹配规则不一样。
    wuzhizuiguo
        38
    wuzhizuiguo  
    OP
       2021 年 1 月 22 日
    @aibangjuxin 大佬强啊, fgrep 没有报 "grep: memory exhausted"
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1822 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 05:16 PVG 13:16 LAX 21:16 JFK 00:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86