我有一些日志文件,其中包含以下信息
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吗?
答案 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
在模式空间中读取两行,如果第二行与开始行的模式不匹配,则用空格替换其前一行换行并重复。否则打印然后删除第一行并重复。