如何使用 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
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">
= <->
...
...
...