2014-10-27 84 views
1

我想分析一个真正巨大的日志文件,这里例如快捷方式:shell脚本解析一个巨大的日志文件

===== 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线总是以“=====”后跟一个字符串 此后每隔一行开始与“/体积/ ...”,这意味着启动是类型,所以f我已经设法获取信息,但真正的问题始于'rw = or 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-$#; 

,但我不知道如果循环是正确的或在哪里放它。

+1

这应该是你r第一个问题,而不是[this](http://stackoverflow.com/q/26587589/2088135) – 2014-10-27 14:06:26

+1

在前面的问题中,你得到了一些结果。你尝试过与他们玩吗? – fedorqui 2014-10-27 14:06:37

+0

是啊我已经有了一个IFS循环,然后我问了第一个问题,并想自己尝试,但它不工作 – howdoesthiswork 2014-10-27 14:10:45

回答

1

试一下这个脚本可以帮助你

输入

[email protected]:/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 

脚本

[email protected]:/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]; 
} 

如何执行呢?

[email protected]:/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 
+0

这看起来不错,但现在真的很愚蠢的问题...我想测试一下它的长日志文件,我有什么命令脚本写那么其上运行的日志文件,当我执行它在这样的终端 – howdoesthiswork 2014-10-27 14:32:23

+0

@howdoesthiswork类型: - 'AWK -vOFS =”, “-f parse_log.awk your_log_file' – 2014-10-27 14:34:01

+0

好吧,现在它的工作原理,但它确实只列出每个vFiler第一类型的主机,它忽略了那里是与同vFiler – howdoesthiswork 2014-10-27 14:57:01

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 
+0

我没有得到任何输出当我在我的文件 – howdoesthiswork 2014-10-27 14:47:54

+0

上执行这个命令时,如果我将日志文件的路径放在命令后面,它应该可以工作吗? – howdoesthiswork 2014-10-27 14:58:31

+0

so,awk -F [,\ =]'/^=====/{filler = $ 7} /r[wo]=[^.]*.net/{split($5,a,“:”) ;对于(我在a)打印填充,$ 1,a [i]} inputFile - 是不够的? – howdoesthiswork 2014-10-27 15:13:21