我有一个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 回答
好吧,也许使用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
您可以尝试以下方法:
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}'
:)
戴尔
结合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'[\\[\\] ]'
将字段分隔符设置为[
,]
或 ``输入数据:
输出: