我在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也会在方括号内有数字,而我的日期只是数字。如果字符串的格式不同,它会正确地进行比较吗?我还没弄明白如何将日期返回的日期编号推入带括号的字符串中。
答案 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]