【问题标题】:bash: syntax error: operand expected (error token is "-")bash:语法错误:预期操作数(错误标记为“-”)
【发布时间】: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_strlog_date 的实际值是什么的情况下。
  • 也就是说,我真的不知道您为什么要以这种方式混合算术和扩展测试语法。 (( ( $(date +%s) - log_date ) &lt;= 3600 )) &amp;&amp; echo "$line" 语法较少。
  • 此外,您的代码不会仅使用您提供的输入行导致所述错误;在ideone.com/e57xWm 看到它正常运行(并选择不打印任何内容,但 抛出任何错误)。请尝试遵循您的代码示例中的 minimal reproducible example 定义,以便其他人能够真正看到您自己提出的问题,并测试他们的答案。
  • 看起来有一条日志行以************ S 开头,而不是日期和时间。您需要过滤掉不符合预期格式的行。
  • 这看起来像问题 Barmar,我最初一直在使用 cat,然后 grepping 查找某个错误,然后尝试使用 awk。我什至没有想到我现在使用这种方法来获取整个日志。

标签: linux bash shell


【解决方案1】:

正如 cmets 所指出的,我得到的数据不是日期,因为它正在解析整个日志。为我想要的文本添加输入文件解决了我的问题,我已更改为 Charles 的建议。

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 ) <= 3600 )) && echo "$line"
done < <(grep ERROR_STRING /path/to/file.log)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多