连接多行日志条目

时间:2018-08-21 15:44:06

标签: bash awk sed

我有一个大型日志文件,其中包含以下各种条目(\n表示换行符):

111111,GO,2018-08-09 14:10:32.805,1,xxxxxxxxx,yyyy,I                          \n
  ,NAME-01/0.3-445.44,,                                                       \n
                                                                              \n
222222,STOP,.......................

每个日志条目均以5到9位数字开头。有时,日志条目会分成多行。发生这种情况时,日志条目满足以下条件:

  • 第一条登录行以5到9位数字开头
  • 所有连续行均以空白序列开头,后跟, <逗号>
  • 最后一个登录项只能包含空格
  • 日志条目的每一行具有相同的长度,并用空格填充。

上面的示例显示第一个日志条目就是这种情况。第二个没有。

如上例所示,

我想将多行条目连接成一行,并删除所有虚假空格。

以上结果应变为:

111111,GO,2018-08-09 14:10:32.805,1,xxxxxxxxx,yyyy,I,NAME-01/0.3-445.44,,
222222,STOP,.......................

我该如何实现?

1 个答案:

答案 0 :(得分:0)

根据您写的条件,可能会帮助您解决问题的工具是Awk:

([A-Za-z0-9 ()€_-]+)(?<!_t)\.jpg

这将输出:

awk '!/^[[:blank:]]+(,|$)/{print p; p=""}
     { gsub(/(^[[:blank:]]*|[[:blank:]]*$)/,"",$0); p = p $0 }
     END {print p}' logfile

它以下列方式工作:

  1. 111111,GO,2018-08-09 14:10:32.805,1,xxxxxxxxx,yyyy,I,NAME-01/0.3-445.44,, 222222,STOP,....................... :每次找到一行不以空格开头,后跟逗号或仅以空格开头的行,它将打印保存日志的变量!/^[[:blank:]]+(,|$)/{print p; p=""}输入并清除该变量。
  2. p:它将始终将当前日志文件行连接到变量{ gsub(/(^[[:blank:]]*|[[:blank:]]*$)/,"",$0); p = p $0 },但首先,它将删除该行开头和结尾的所有空白线。
  3. p:到达文件末尾时,它仍然需要打印一个已构建的日志条目。