如何使用 awk 解析 Amazon S3 日志?

How can I parse Amazon S3 logs with awk?

awk 要求您为每个字段提供分隔符,默认为 space 字符,但对于 Amazon S3 的服务器日志,有时每个字段中都有 spaces场地。例如,时间字段中有一个(例如:[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 \;

然后是 运行 awk。有没有办法在不破坏我的关键参数的情况下通过 cat 进行转换,但仍然允许它被 awk 解析?

编辑:我尝试将 gawk 与 FPAT 结合使用,但没有得到与预期相同的结果。

Package gawk-3.1.7-10.10.amzn1.x86_64 already installed and latest version

我的输出:

 = <49a266cb12a607172a6adc1e468782f644b56ec22e3202cb735601b4e5524c08>
 = <BUCKET>
 = <[10/Apr/2015:19:56:22>
 = <+0000]>
 = <111.11.1111.11>
 = <->
 = <xxx>
 = <REST.GET.OBJECT>
 = <something.mp4>
 = <"GET>
 = </something.mp4>
 = <HTTP/1.1">
 = <403>
 = <AccessDenied>
 = <243>
 ...

$4 对我来说是“+0000”而 $3 缺少日期的剩余部分,所以它似乎没有用?

GNU awk with FPAT 来救援:

awk 'BEGIN{ FPAT = "(\"[^\"]+\")|(\[[^]]+\])|([^ ]+)"} {
     for (i = 1; i <= NF; i++) printf "$%d = <%s>\n", i, $i}' s3.log

输出:(链接的 ECS 文档上提供了示例日志)

 = <79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be>
 = <mybucket>
 = <[06/Feb/2014:00:00:38 +0000]>
 = <192.0.2.3>
 = <79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be>
 = <3E57427F3EXAMPLE>
 = <REST.GET.VERSIONING>
 = <->
 = <"GET /mybucket?versioning HTTP/1.1">
 = <200>
 = <->
 = <113>
 = <->
 = <7>
 = <->
 = <"-">
 = <"S3Console/0.4">
 = <->
...
...
...

Code Demo