使用awk / sed将相同模式之间的多条线合并为一条线

时间:2016-03-19 10:37:00

标签: bash awk sed

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

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吗?

2 个答案:

答案 0 :(得分:2)

您可以使用以下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

答案 1 :(得分:0)

这可能适合你(GNU sed):

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

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