awk
要求为每个字段提供一个分隔符,默认为空格字符,但在AmazonS3的服务器日志中,有时每个字段内都有空格。例如,时间字段中有一个(例如:[06/Feb/2014:00:00:38 +0000]
包含一个),也可能是密钥字段中的一个。
http://docs.aws.amazon.com/AmazonS3/latest/dev/LogFormat.html
有没有一种方法可以简单地在awk中解析这些内容,或者在将它们提供给awk之前,我是否需要以某种方式对它们进行转换?
如果是的话,我该怎么做呢?我目前正在合并我的所有日志文件:
find . -type f -exec cat {} >> ../compiled.log ;
然后在这件事上大放异彩。有没有一种方法可以在不破坏我的关键参数的情况下通过cat进行转换,但仍然允许awk解析它?
编辑:我试着在FPAT中使用gawk,但我没有得到预期的结果。
Package gawk-3.1.7-10.10.amzn1.x86_64 already installed and latest version
我的输出:
$1 = <49a266cb12a607172a6adc1e468782f644b56ec22e3202cb735601b4e5524c08>
$2 = <BUCKET>
$3 = <[10/Apr/2015:19:56:22>
$4 = <+0000]>
$5 = <111.11.1111.11>
$6 = <->
$7 = <xxx>
$8 = <REST.GET.OBJECT>
$9 = <something.mp4>
$10 = <"GET>
$11 = </something.mp4>
$12 = <HTTP/1.1">
$13 = <403>
$14 = <AccessDenied>
$15 = <243>
...
4美元对我来说是"+0000",3美元缺少日期的剩余部分,所以它似乎不起作用?
带有FPAT
的GNU awk出手相救:
awk 'BEGIN{ FPAT = "("[^"]+")|(\[[^]]+\])|([^ ]+)"} {
for (i = 1; i <= NF; i++) printf "$%d = <%s>n", i, $i}' s3.log
输出:(带有链接ECS文档上提供的示例日志)
$1 = <79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be>
$2 = <mybucket>
$3 = <[06/Feb/2014:00:00:38 +0000]>
$4 = <192.0.2.3>
$5 = <79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be>
$6 = <3E57427F3EXAMPLE>
$7 = <REST.GET.VERSIONING>
$8 = <->
$9 = <"GET /mybucket?versioning HTTP/1.1">
$10 = <200>
$11 = <->
$12 = <113>
$13 = <->
$14 = <7>
$15 = <->
$16 = <"-">
$17 = <"S3Console/0.4">
$18 = <->
...
...
...