我想解析一个非常庞大的日志文件,这里是一个示例快捷方式:
===== 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-$#;
但我不知道循环是否正确或放在哪里。
答案 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