我正在尝试从一堆基本上是压缩日志文件的.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 = value1 key2 = value2可以按任何顺序出现
感谢帮助。谢谢!
答案 0 :(得分:4)
zcat input.gz | sed -n 's/.*\(userAgent=[^=]*\) [^ =][^ =]*=.*/\1/p'
使用gnu - sed:,也可以更短一些
zcat input.gz | sed -n 's/.*\(userAgent=[^=]*\) [^ =]\+=.*/\1/p'
zcat input.gz | grep -o 'userAgent=[^=]*' | sed 's/ [^ ]*$//'
zgrep -o 'userAgent=[^=]*' input.gz | sed 's/ [^ ]*$//'
答案 1 :(得分:3)
由于您提到 key=value
对可以按任何顺序出现,因此这是使用awk
执行此操作的一种方法。
zcat input.gz | awk -F= '
{
for(i=1;i<=NF;i++) {
if($i~/userAgent/) {
sub(/[^ ]+$/,"",$(i+1))
print "userAgent="$(i+1)
}
}
}'