V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
SharkIng
V2EX  ›  问与答

[SHELL] 如何在不使用 tail -f 以及 While 等 Block loop 的时候逐行读取某 Log 文件的最后 N 行?

  •  
  •   SharkIng · Aug 8, 2016 · 2169 views
    This topic created in 3563 days ago, the information mentioned may be changed or developed.
    现在做法是 tial -f | while read line. 但是同事说这样不太好,因为这个 Script 需要基本上每 1 个小时运行一次,读取一个 Log 文件然后判断最后 5 行包不包含某程序运行结束的记录

    求解
    9 replies    2016-08-11 10:56:40 +08:00
    beyond_st
        1
    beyond_st  
       Aug 8, 2016
    你这个因为并不能解释为什么不太好。
    27
        2
    27  
       Aug 8, 2016
    tail -n 5 file 不行?
    ryd994
        3
    ryd994  
       Aug 8, 2016 via Android
    看不出有什么不好
    uuspider
        4
    uuspider  
       Aug 8, 2016
    tail 不加-f ,使用 crontab ,你同事是不是这个意思?
    Fedor
        5
    Fedor  
       Aug 8, 2016
    @27 LZ 的意思应该是当文件内容有更新的时候, 依然是最后的 N 行.
    SharkIng
        6
    SharkIng  
    OP
       Aug 8, 2016
    @beyond_st
    @ryd994
    我的理解是 while 容易进入死循环种种,说实话我也不知道为什么不好


    @Fedor 对,是需要这样
    @uuspider 同时一再强调不能用 loop ,这个才是蛋碎的地方
    DravenJohnson
        7
    DravenJohnson  
       Aug 9, 2016
    python:
    ```
    files = reversed(open(LOGFILE, 'r').readlines()[-10:])
    for line in files:
    jsons = json.loads(line)
    ```
    uuspider
        8
    uuspider  
       Aug 10, 2016
    @SharkIng 直接用 grep 吧。
    SharkIng
        9
    SharkIng  
    OP
       Aug 11, 2016
    @uuspider 因为是多行处理, Grep 好像没办法做到要求,最后用 Python 写了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1709 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 16:24 · PVG 00:24 · LAX 09:24 · JFK 12:24
    ♥ Do have faith in what you're doing.