将分段的syslog消息合并为一个消息

时间:2018-01-16 20:49:49

标签: shell awk syslog

我有syslogs存储为段(即每个系统日志消息被分成如下所示的部分),我需要帮助将这些分段的部分合并为一条消息。

下面是示例系统日志消息:

2018-01-06 22:00:00 aaa bbbb xxxxxxxxxx 3 0 text,text,text,text,text,text,text,text,...  
2018-01-06 22:00:00 aaa bbbb xxxxxxxxxx 3 1 text,text,text,text,text,...(i.e.continuation of message from part 1)  
2018-01-06 22:00:00 aaa bbbb xxxxxxxxxx 3 2 text,text,text.(i.e.continuation of message from part 2)   

此处xxxxxxxxxx(此字段为10位数ID)aaabbbb都是系统日志消息的标题)
预期产出:

2018-01-06 22:00:00 aaa bbbb xxxxxxxxxxx text,text,text...

1 个答案:

答案 0 :(得分:1)

您可以使用以下awk命令格式化您的系统日志:

<强>码

awk '{str=$1" "$2" "$3" "$4" "$5}{for(j=8; j<=NF; j++)a[str]=a[str]" "$j}END{for(i in a)print i""a[i]}' input.log  

输入的输出:

2018-01-06 22:00:00 aaa bbbb xxxxxxxxxx text,text,text,text,text,text,text,text,... text,text,text,text,text,...(i.e.continuation of message from part 1) text,text,text.(i.e.continuation of message from part 2)

<强>解释

    每行
  • for(j=8; j<=NF; j++)a[$1" "$2" "$3" "$4" "$5]=a[$1" "$2" "$3" "$4" "$5]" "$j将创建一个数组,其中索引是前5个字段的串联,这将在分组后重复使用,每个单元格的值将填充第8个字段到EOL。
  • 当您阅读EOF时END{for(i in a)print i""a[i]}将被触发,并将显示每个索引/键(即$1" "$2" "$3" "$4" "$5)及其内容(即具有相同索引的行的分组)。