从unix中的.gz日志文件中提取值



我正试图从一堆.gz日志文件中提取一个特定的值(在本例中为userAgent),这些文件本质上是压缩的日志文件。这些日志文件中每个日志语句的格式如下:

2013-06-20;02:00:02.503 [664492205@qtp-446095113-8883]-Activity [response@12293 appId=testApp userAgent=BundleDeviceFamily/iPhone,iPad (iPad; iPad2,5; iPad2,5; iPhone OS 6.1.3) EXEC_TM=123  FLOW=response TOKN_TM=0 GW_TM=2314.529 http.status=200 id=029dde45-802c-462a-902b-138bc5490fba offeringId=iPad httpUrl= test.com AUD_TM=0 ipAddress=10.10.10.10 ]
2013-06-20;02:00:02.504 [664492205@qtp-446095113-8883]-Activity [response@12293 appId=testApp userAgent=FNetwork/609.1.4 Darwin/13.0.0 id=029dde45-802c-462a-902b-138bc5490fba EXEC_TM=123  FLOW=response TOKN_TM=0 GW_TM=2314.529 http.status=200  offeringId=iPad httpUrl= test.com AUD_TM=0 ipAddress=10.10.10.10 ]

在这种情况下,我想提取userAgent字段,并以以下格式之一显示结果:

userAgent=BundleDeviceFamily/iPhone,iPad (iPad; iPad2,5; iPad2,5; iPhone OS 6.1.3)
userAgent=FNetwork/609.1.4 Darwin/13.0.0

等等。

或者只打印值,例如:

BundleDeviceFamily/iPhone,iPad (iPad; iPad2,5; iPad2,5; iPhone OS 6.1.3)
FNetwork/609.1.4 Darwin/13.0.0

编辑:只是为了添加更多信息,这些空格分隔的字段,如key1=value1key2=value2,可以以任何顺序出现

感谢您的帮助。谢谢

使用zcat+sed:

zcat input.gz | sed -n 's/.*(userAgent=[^=]*) [^ =][^ =]*=.*/1/p'

使用gnu-sed也可以短一点:

zcat input.gz | sed -n 's/.*(userAgent=[^=]*) [^ =]+=.*/1/p'

和一些grep,sed组合:

zcat input.gz | grep -o 'userAgent=[^=]*' | sed 's/ [^ ]*$//'

zcat和grep可以组合在zgrep中(感谢lhf):

zgrep -o 'userAgent=[^=]*' input.gz | sed 's/ [^ ]*$//'

由于您提到key=value对可以以任何顺序出现,因此这里有一种使用awk的方法。

zcat input.gz | awk -F= '
{
  for(i=1;i<=NF;i++) {
    if($i~/userAgent/) { 
      sub(/[^ ]+$/,"",$(i+1))
      print "userAgent="$(i+1) 
    }
  }
}' 

相关内容

  • 没有找到相关文章

最新更新