查看:1918|回复:0
如何使用 awk 分解出日志中的信息发表时间:2013-01-08 14:32:52

我爱java

0分享0主题0帖子

学徒一级

(初出茅庐)

由于我们在 IBM HTTP Server 配置文件中指定了访问日志的固定格式,因此,我们可以轻易地使用 awk 解析,抽取我们需要的数据。

以下面的示例日志为例:

202.189.63.115 - - [31/Aug/2012:15:42:31 +0800] "GET / HTTP/1.1" 200 1365 "-"
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1"

   $0 就是整个记录行
   $1 就是访问 IP ” 202.189.63.115”
   $4 就是请求时间的前半部分 “[31/Aug/2012:15:42:31”
   $5 就是请求时间的后半部分 “+0800]”

以此类推……

当我们使用默认的域分割符时,我们可以从日志中解析出下面不同类型的信息:

awk '{print $1}' access.log       # IP 地址  (%h)
awk '{print $2}' access.log       # RFC 1413 标识  (%l)
awk '{print $3}' access.log       # 用户 ID  (%u)
awk '{print $4,$5}' access.log     # 日期和时间  (%t)
awk '{print $7}' access _log      #  URI (%>s)
awk '{print $9}' access _log      # 状态码 (%>s)
awk '{print $10}' access _log     # 响应大小  (%b)

我们不难发现,仅使用默认的域分隔符,不方便解析出请求行、引用页和浏览器类型等其他信息,因为这些信息之中包含不确定个数的空格。因此,我们需要把域分隔符修改为 “ ,就能够轻松读出这些信息。

awk -F\" '{print $2}' access.log        # 请求行 (%r)
awk -F\" '{print $4}' access.log        # 引用页
awk -F\" '{print $6}' access.log        # 浏览器

注意:这里为了避免 Unix/Linux Shell 误解 “ 为字符串开始,我们使用了反斜杠,转义了 “ 。

您需要登录以后才可以回帖    登录|注册