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

Parsing complex log file with awk or sed or other

我有这样的日志文件:

 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 之后和 : 之前打印昵称。在 : 之后打印文本。

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

试试这一行:

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

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

我的建议,它在 sometext

中没有处理 space 的大缺点

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' - ' 在 space 上拆分字段 - space

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 个字符