【问题标题】:Remove date from log files从日志文件中删除日期
【发布时间】:2013-04-15 06:07:21
【问题描述】:

我有一个irc日志如下

04/14/13 21:38<@Hamatti> Lorem ipsum dolor sit amet
04/14/13 21:39<@Hamatti> consectetur adipiscing elit.
04/14/13 21:45<@Hamatti> Duis facilisis convallis lacus

EDIT1。对不起,我不清楚我的意图。所以我希望前一个的输出是

21:38<@Hamatti> Lorem ipsum dolor sit amet
21:39<@Hamatti> consectetur adipiscing elit.
21:45<@Hamatti> Duis facilisis convallis lacus

所以时间很重要。

EDIT2 还有部分日志,格式比较早的

20:12<@Hamatti> Something.
20:13<@Hamatti> Funny.
20:13<@Hamatti> Happened.

我需要不修改这些行。

由于我的旧日志格式没有日期戳,我想从以后的日志中删除日期。

sed 's/[0-9]{2}\/[0-9]{2}\/[0-9]{2}//g' logfile

sed 中的正则表达式似乎在正则表达式测试人员中工作,但这个 sed 没有做任何事情。我想知道问题出在哪里?非常欢迎使用 bash 工具(sed、awk 等)的任何提示。由于只有部分日志有日期,我不能使用类似的东西

awk '{$1 = ""; print}'

因为我需要先检查。

【问题讨论】:

    标签: regex awk sed


    【解决方案1】:

    这个 sed 命令可以完成这项工作:

    sed -i.bak 's/^[^<]*//' logfile
    

    编辑:根据您的评论,这只会清除日期部分并保留时间戳:

    sed -i.bak 's/^[^ ]* //' logfile
    

    编辑 2:基于您第二次编辑的问题:

    sed -i.bak 's#^[0-9]*/[0-9]*/[0-9]* ##' logfile
    

    或者像这样在 sed 中使用扩展的正则表达式功能:

    苹果机:

    sed -E -i.bak 's#^[0-9]{1,2}/[0-9]{1,2}/[0-9]{1,2} ##' logfile
    

    Linux:

    sed -r -i.bak 's#^[0-9]{1,2}/[0-9]{1,2}/[0-9]{1,2} ##' logfile
    

    【讨论】:

    • 感谢anubhava,但我意识到我不清楚。我只想要日期,但保存时间戳。请参阅我更新的原件。无论如何感谢您的帮助。
    • 哦,我还要编辑。由于部分数据有日期,部分数据没有,最新的 sed 会从没有日期的数据中删除时间戳。
    • 再次感谢您的时间和精力。
    • 您可以修改第一个编辑以避免时间戳:sed 's#^../[^ ]* ##'(示例显示第一个日期元素填充到两个位置,因此我们不需要在那里花哨 - 除非示例错误,当然。)
    【解决方案2】:

    cut 命令在这里很容易应用:

    cut -d " " -f "2-" logfile
    

    意思是:

    如果每一行都用空格分隔(分隔符,-d 选项),那么从第二个开始取出所有项目。

    【讨论】:

    • 我发现cutsed 更容易理解。点赞!