【发布时间】:2019-01-18 17:51:22
【问题描述】:
我正在尝试查看过去一小时内某些消息的日志。日志格式如下:
[1/18/19 9:59:13:791 CST] <Extra text here...>
我在与 awk 进行日期比较时遇到了麻烦,所以我的想法是转换为纪元并进行比较。我正在获取字段 1 并切断字段 2 的毫秒数,并删除 [](尽管我想我可以为我的目的只做 [)。
while read -r line || [[ -n "$line" ]]
do
log_date_str="$(awk '{gsub("\\[|\\]", "");print $1" "substr($2,1,length($2)-4)}' <<< "$line")"
log_date="$(date -d "$log_date_str" +%s)"
[[ $(($(date +%s)-$log_date)) -le 3600 ]] && echo "$line"
done < /path/to/file
但是,当我尝试对日志文件运行此命令时,我收到此错误:
date: invalid date `************ S'
-bash: 1547832909-: syntax error: operand expected (error token is "-")
单次约会,例如“1/18/19 9:59:13”适用于将日期转换为纪元,但我不确定该错误在哪里。
【问题讨论】:
-
运行
bash -x yourscript将让您看到实际运行的命令,以及变量的真实值;这使得隔离发生的事情变得更加容易,尤其是在我们不知道您的line包含什么,或者log_date_str或log_date的实际值是什么的情况下。 -
也就是说,我真的不知道您为什么要以这种方式混合算术和扩展测试语法。
(( ( $(date +%s) - log_date ) <= 3600 )) && echo "$line"语法较少。 -
此外,您的代码不会仅使用您提供的输入行导致所述错误;在ideone.com/e57xWm 看到它正常运行(并选择不打印任何内容,但不 抛出任何错误)。请尝试遵循您的代码示例中的 minimal reproducible example 定义,以便其他人能够真正看到您自己提出的问题,并测试他们的答案。
-
看起来有一条日志行以
************ S开头,而不是日期和时间。您需要过滤掉不符合预期格式的行。 -
这看起来像问题 Barmar,我最初一直在使用 cat,然后 grepping 查找某个错误,然后尝试使用 awk。我什至没有想到我现在使用这种方法来获取整个日志。