shell脚本来解析一个巨大的日志文件

时间:2014-10-27 13:58:11

标签: shell parsing awk

我想解析一个非常庞大的日志文件,这里是一个示例快捷方式:

===== fspCIV0
/vol/vol0 -sec=sys,rw=fspsanp42.net,root=fspsanp42.net,nosuid
===== fcvCIS01
/vol/ARDW -sec=sys,rw
/vol/ARDW -sec=sys,rw
/vol/ARDW -sec=sys,rw,nosuid
/vol/ARDW -sec=sys,rw
/vol/ARDW -sec=sys,rw=none
/vol/lonulixda -sec=sys,rw=fcvsan10.net:fcvsan11.net,root=fcvsan10.net:fcvsan11.net

它继续这种方式再多几页...

所需的输出应为:

vFiler, Type, host
fspCIV0, /vol/vol0, fspsanp42.net
fcvCIS01, /vol/lonulixda, fcvsan10.net
fcvCIS01, /vol/lonulixda, fcvsan11.net

vFiler行始终以' ====='后跟一个字符串 在此之后,每隔一行以' / vol /...'开头;这是一个类型,到目前为止我已经设法获取信息,但真正的问题始于在' rw =或ro ='之后列出的服务器名称。 (并在' root ='之后重复。)

它应该忽略在rw =或ro =。

之后没有列出服务器的每一行

对于每个即使具有相同类型的新服务器,我想开始一个新行,如果列出了多个服务器,则它们由':'分隔。 。

我认为可以用包含IFS的循环列出它:':' 。 但我不太确定如何写它...

有人能帮帮我吗?提前谢谢

我尝试过:

awk -v RS="=====" -v OFS="," 'BEGIN {print "vFiler", "Type" } NF{print $1, $2}'

和while循环我认为可能有效:

while IFS=':' read -r host $1-$#;

但我不知道循环是否正确或放在哪里。

2 个答案:

答案 0 :(得分:1)

试试这个脚本可能对你有帮助

<强>输入

akshay@Aix:/tmp$ cat file
===== fspCIV0
/vol/vol0 -sec=sys,rw=fspsanp42.net,root=fspsanp42.net,nosuid
===== fcvCIS01
/vol/ARDW -sec=sys,rw
/vol/ARDW -sec=sys,rw
/vol/ARDW -sec=sys,rw,nosuid
/vol/ARDW -sec=sys,rw
/vol/ARDW -sec=sys,rw=none
/vol/lonulixda -sec=sys,rw=fcvsan10.net:fcvsan11.net,root=fcvsan10.net:fcvsan11.net

<强>脚本

akshay@Aix:/tmp$ cat parse_log.awk
BEGIN{
    print "vFiler", "Type", "host"
}
/=====/{
    vFiler=$2
    next
}
match($0,/root=[^,]*/){
    n=split(substr($0,RSTART+5,RLENGTH-5),N,/:/)
    for(i=1; i<=n; i++)print vFiler,$1,N[i];
}

如何执行?

akshay@Aix:/tmp$ awk -vOFS="," -f parse_log.awk file

<强>输出

vFiler,Type,host
fspCIV0,/vol/vol0,fspsanp42.net
fcvCIS01,/vol/lonulixda,fcvsan10.net
fcvCIS01,/vol/lonulixda,fcvsan11.net

答案 1 :(得分:0)

简单版本将是

awk  -F[,\ =] '/^=====/{filler=$7} /r[wo]=[^.]*.net/{split($5, a, ":"); for (i in a) print filler,$1,a[i]}'

将输出

fspCIV0 /vol/vol0 fspsanp42.net
fcvCIS01 /vol/lonulixda fcvsan10.net
fcvCIS01 /vol/lonulixda fcvsan11.net
相关问题