使用awk或sed或其他解析复杂的日志文件

时间:2015-01-30 12:44:33

标签: bash awk sed

我有这样的日志文件:

 ZZ nickname1: sometexthere17 Jan 10:19PM - ZZ nickname2: sometexthere19 Jan 11:19PM - ZZ nickname3: sometexthere20 Jan 09:21PM - ...

ZZ static value nickname dynamic and I need to print after : sometexthere dynamic and I need to print after text there is no space and it is date value(17 Jan 10:19PM -) - is a separate

我需要将输出打印到csv文件,如下所示:

Date;Nickname;Text 17 Jan 10:19PM;nickname1;sometexthere ...

我可以使用awk -F来解析相同的内容。我如何使用awk或sed作为我的例子?

我想我需要在ZZ :之前打印昵称。在:之后打印文字。

但是我如何解析文本和日期值?

2 个答案:

答案 0 :(得分:2)

试试这行:

 awk -F': ' -v RS="-" -v OFS=";" 
      '{sub(/ZZ /,"",$1);n=length($2);
        sub(/\n/,"",$2); d=substr($2,n-14);
        s=substr($2,1,n-15);print d,$1,s}' logFile

幻数14是日期字符串的长度,例如。 17 Jan 10:19PM

答案 1 :(得分:0)

我的建议,在sometext

中没有处理空间的大缺点

awk -F' - ' '{ for(i=1;i<=NF;i++){ split($i,x," "); printf("%s %s %s;%s;%s\n",substr(x[3],length(x[3])-1), x[4],x[5],substr(x[2],0,length(x[2])),substr(x[3],0,length(x[3])-1))} }' test

做了什么:

-F' - '分割空格上的字段 - 空格

for(i=1;i<=NF;i++)在字段上循环

split($i,x," ");从每个字段创建一个新数组(ZZ [...])

printf("%s %s %s;%s;%s\n"准备输出

substr(x[3],length(x[3])-1)首先%s,当天,分裂的第3个最后2个字符

x[4],x[5]接下来的两个%s,月和时间

substr(x[2],0,length(x[2]))昵称减去:在结束时

substr(x[3],0,length(x[3])-1))文本字段,减去当天的2个字符