首页 文章

根据Unix时间戳过滤Linux日志

提问于
浏览
0

我有一个Linux服务器登录 . 条目的格式如下:

[timestamp(1970年1月1日起的秒数)]日志数据输入

我需要一个bash脚本,它将获取日志文件的名称并仅输出昨天的条目(从前一天的12:00到23:59:59)并将这些行输出到新文件 .

我已经看过各种基于日期过滤日志的脚本,但到目前为止所有这些脚本都以更易读的格式处理日期戳,或者不是动态的 . 他们依赖于硬编码日期 . 我想要一个每天在cron作业中运行的脚本,所以它必须知道每次运行时的当前日期 .

谢谢 .

Update :这是我到目前为止所拥有的 . 它似乎永远不会对日期进行评估 . 它为日期打印00,所以一切都通过 .

head -5 logfile.log | awk '{
    if($1 >= (date -d "today 00:00:00" +"%s")) 
        print $1 (date -d "today 00:00:00" +"%s");
    }'

我很困惑,即使日期评估正确,$ 1将在方括号内有数字,而我的日期将只是数字 . 如果字符串的格式不同,它会正确地进行比较吗?我还没想出如何将日期返回的日期编号推入带括号的字符串中 .

3 回答

  • 0

    好吧,也许使用Dale说的日期 . 但是使用一个小技巧来提取“[”和“]”,并在比较日期之后 . 像这样的东西:

    YESTERDAY = $(日期-d“昨天00:00:00”“%s”)

    TODAY = $(日期-d“今天00:00:00”“%s”)

    awk -v MIN = $ -v MAX = $ -F [“]”“[”]'{if($ 2> = MIN && $ 2 <= MAX)print $ 0}'logfile.log

  • 0

    您可以尝试以下方法:

    YESTERDAY = $(日期-d "yesterday 00:00:00" "%s")
    今天= $(日期-d "today 00:00:00" "%s")
    cat your_log |
    awk -v MIN = $ -v MAX = $ '{if($1 >= MIN && $1 < MAX) print}'

    :)
    戴尔

  • 1

    结合Glenn,Dale和Davison的提示和技巧:

    awk -v today=$(date -d "today 00:00:00" +"%s") -v yesterday=$(date -d "yesterday 00:00:00" +"%s") -F'[\\[\\] ]' '{ if($2 >= yesterday && $2 < today) print }' logfile.log

    使用shell的 $() 命令替换将变量提供给awk的 -v 参数解析器
    -F'[\\[\\] ]' 将字段分隔符设置为 [] 或 ``

    输入数据:

    [1300000000 log1 data1 entry1]
    [1444370000 log2 data2 entry2]
    [1444374000 log3 data3 entry3]
    [1444460399 log4 data4 entry4]
    [1500000000 log5 data5 entry5]
    

    输出:

    [1444370000 log2 data2 entry2]
    

相关问题