【问题标题】:Processing log file entries with double-quotes on the timestamp处理时间戳带双引号的日志文件条目
【发布时间】:2019-03-27 00:58:09
【问题描述】:

我有一个 CSV 日志文件,其中每条记录的时间戳都有双引号,格式如下:

"2018-10-22 14:38:29", ...comma-separated values...
"2018-10-22 13:18:07", ...comma-separated values...

我想根据时间戳提取记录,并使用date 以编程方式调整此时间戳,但由于双引号,我没有太多运气这样做。

当我在脚本中硬编码时间戳时,我可以让它工作......

# This will work
awk ' 
    BEGIN { FS=" "; split_stamp="\"2018-10-22 14:00:00\"" }
    $1<=split_stamp { print $0 )
' $filename

但不是将目标时间戳分配给单独的变量(我最好通过命令行选项设置)...

# But this fails silently
split_at="\"2018-10-22 00:00:00\""
awk ' 
    BEGIN { FS=" "; split_stamp=$split_at }
    $1<=split_stamp { print $0 )
' $filename

关于如何处理双引号的任何建议(无需制作单独的日志文件副本并删除双引号)?或者也许有比awk 更好的工具?

【问题讨论】:

  • 有两种解决方案。编写自己的 bash 解析器,并记住正确处理 " esacped doubleqoutes \" "。或者只使用csvtool

标签: bash date awk timestamp quotes


【解决方案1】:

使用 csvtool 的解决方案:

printf "%s\n" '"2018-11-22 13:18:07",aaa' '"2018-09-21 14:38:29",bbb' > input.csv
split_at_ts=$(date --date="2018-10-22 00:00:00" +%s);
func() { 
    declare -g split_at_ts
    local ts
    ts=$(date --date="$1" +%s)
    if ((ts < split_at_ts)); then 
        printf "%s" "$*"
    fi
}
export -f func
export split_at_ts
csvtool call f input.csv

csvtool 将为 csv 文件中的每一行调用函数 f,其参数等于该 csv 文件中的字段。
要比较两个日期,我需要将它们转换为自纪元以来的秒数,然后比较数字。如果日期更早,则 split_at 我从函数 func 内部打印它。

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 2010-09-26
    • 2017-06-13
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    相关资源
    最近更新 更多