根据Unix时间戳

时间:2015-10-07 19:28:28

标签: linux bash

我在linux服务器上有一个日志。条目的格式为:

[时间戳(自1970年1月1日起的秒数)]日志数据输入

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

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

感谢。

更新:这是我到目前为止所拥有的。它似乎永远不会对日期进行评估。它为日期打印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 :(得分:1)

好吧,也许正如戴尔所说的那样使用日期。但是使用一个小技巧来提取“[”和“]”,并在比较日期之后。像这样:

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

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

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

答案 1 :(得分:0)

您可以尝试以下方式:

YESTERDAY = $(日期-d“昨天00:00:00”+“%s”)
TODAY = $(日期-d“今天00:00:00”+“%s”)
cat your_log | \
awk -v MIN = $ {YESTERDAY} -v MAX = $ {TODAY}'{if($ 1> = MIN&& $ 1< MAX)print}'

:)
戴尔

答案 2 :(得分:0)

结合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&#39; -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]