【问题标题】:Merge multiple lines between same pattern into a single line using awk/sed使用 awk/sed 将同一模式之间的多行合并为一行
【发布时间】:2016-07-06 03:59:04
【问题描述】:

我有一些日志文件,其中包含如下信息

2016-03-18 00:07:43,482 SOME ERROR 
OCCURED
API 
LINE INFO
2016-03-18 00:07:44,482 OCCURED
authentication failure
2016-03-18 00:07:45,482 ERROR OCCURED
2016-03-18 00:07:46,482 NOT IMP OCCURED

期望的输出

2016-03-18 00:07:43,482 SOME ERROR OCCURED API LINE INFO
2016-03-18 00:07:44,482 OCCURED authentication failure
2016-03-18 00:07:45,482 ERROR OCCURED
2016-03-18 00:07:46,482 NOT IMP OCCURED

这意味着我想合并 2016-03-18 之间的所有行

我希望每一行都以 2016-03-18 作为模式开始。

有人可以帮助我使用 shell 脚本,最好是使用 awk/Sed 吗?

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    您可以使用以下awk 命令:

    awk '
        /^[0-9]{4}(-[0-9]{2}){2}/ && line {print line; line=""}
        {line = line ? line" "$0 : $0}
        END {print line}
    ' file 
    

    更新

    事实证明,一些awk 实现不支持{n} 量词。例如mawk

    在这种情况下,您必须像这样编写命令:

    mawk '
        /^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/ && line {print line; line=""}
        {line = line ? line" "$0 : $0}
        END {print line}
    ' file
    

    【讨论】:

    • 这对我不起作用。我用过这个 awk ' /^[0-9]{4}(-[0-9]{2}){2}/ && line {print line;行=“”} {行=行? line" "$0 : $0} END {打印行}' tt.txt >tt1.txt
    • @JavaTechy 看起来您的awk 实现不支持{n} 量词。我添加了一个解决方法。
    • 这也不起作用。我是 awk 的新手。我认为这可以帮助你。这个问题类似。但我不知道要改变什么。 stackoverflow.com/questions/21099468/…
    • 对某事感到陌生不是问题,也不是借口。 “这也不起作用”不是有用的错误报告。我显然不能跳进你的电脑并检查什么是“不工作”。你的 awk 版本是多少?
    • 别生气。没关系。我会尝试更多。谢谢您的帮助。它的 1.3.3
    【解决方案2】:

    这可能对你有用(GNU sed):

    sed ':a;N;/\n....-..-.. /!s/\n/ /;ta;P;D' file
    

    将两行读入模式空间,如果第二行与开始行的模式不匹配,则用空格替换其前面的换行符并重复。否则打印然后删除第一行并重复。

    【讨论】:

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