使用 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 个字符
我有这样的日志文件:
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
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 个字符