【问题标题】:shell script to parse a huge log file用于解析巨大日志文件的 shell 脚本
【发布时间】:2014-12-22 17:30:30
【问题描述】:

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

===== 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-$#;

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

【问题讨论】:

  • 这应该是你的第一个问题,而不是this
  • 在上一个问题中你得到了一些结果。你试过和他们“玩”吗?
  • 是的,在我问第一个问题并想自己尝试但它不起作用之前,我已经使用 IFS 循环了
  • @howdoesthiswork 然后向我们展示您的尝试。 它不工作是模棱两可的
  • 是的,我添加了我正在尝试的内容

标签: shell parsing awk


【解决方案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

【讨论】:

  • 这看起来不错,但现在是一个非常愚蠢的问题......我想在长日志文件上测试它,我必须在脚本中编写什么命令才能在日志文件上运行当我执行它时
  • @howdoesthiswork 在终端上输入如下:- awk -vOFS="," -f parse_log.awk your_log_file
  • 好的,现在它可以工作了,但它只列出每个 vFiler 中第一个 Type 的主机,它忽略了在同一个 vFiler 上有另一个 Type 主机的情况
  • @howdoesthiswork :好的,我刚刚编辑了我的帖子,请使用更新的脚本
  • 注意,match 函数需要 GNU awk(即gawk)。
【解决方案2】:

简单的版本是

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

【讨论】:

  • 在我的文件上执行此命令时没有得到任何输出
  • 如果我将日志文件的路径放在命令后面,它应该可以工作吗?
  • so, awk -F[,\ =] '/^=====/{filler=$7} /r[wo]=[^.]*.net/{split($5 , 一种, ”:”); for (i in a) print Filler,$1,a[i]}' inputFile - 还不够吗?
  • /home/pmoberma/test/exports_n7760.out
  • 我用完全相同的方式做了,但它不起作用我不知道为什么
猜你喜欢
  • 2011-04-27
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 2013-04-07
  • 1970-01-01
相关资源
最近更新 更多