1

让我们考虑以下 CSV 文件格式:

server_name status_code timestamp probe_name

其中 status_code 可以是 I 或 E,并且所有字段都由表格分隔

例如,我们可以考虑以下 CSV 行:

albatros.benches.com I 14:55:23.145 througput_probe

每个 CSV 文件都包含一整天的日志。我试图让所有 hh:mm:ss 时间戳都以实际的 YYYY-mm-dd 为前缀,以便生成的行如下所示:

albatros.benches.com I 2013-02-25 14:55:23.145 througput_probe

作为奖励,由于 CSV 文件包含日期(文件名是 log_2013_02_25.txt)并且因为我有许多这些文件(当然是在不同的日子)要“sed”,我希望我可以自动使用文件名作为在其中获取合适日期并将其应用于时间戳转换的种子。

编辑:文件名是 log_YYYY_MM_DD.txt,而不是前面描述的 log_YYYY-MM-DD.txt)

我的 sed 和正则表达式知识相当有限。到目前为止,我正在使用类似的东西:

s/I^T/I^T 2013-02-25 /g
s/E^T/E^T 2013-02-25 /g

(^T 实际上是一个 ^V 后跟一个制表键)

在我所有的文件上,但这对我来说真的很尴尬。如果有一天我们添加另一个状态码(例如 X),这个技巧将不起作用。我想 sed 处理第三个字段并为其添加前缀会更容易出错。我不知道如何正确地做到这一点。

欢迎任何想法!

谢谢

4

1 回答 1

3

假设你所有的 csv 文件都被命名为log_YYYY_MM_DD.txt你可以尝试在你的 csv 文件所在的目录中运行这个 bash 脚本:

#!/bin/bash
for file in log_*.txt; do
    [[ $file =~ [0-9]{4}_[0-9]{2}_[0-9]{2} ]] \
        && date="${BASH_REMATCH}" \
        && sed -E -i.bak "s/\t(E|I)\t/\t\1\t${date//_/-} /" $file
done

所有应该处理的状态码都可以放在括号中。例如,还要处理状态代码X,只需更改(E|I)(E|I|X).

如果您注意到一切都按预期工作,您可以删除.bak以禁用创建备份文件。

于 2013-02-25T20:33:59.743 回答