如何使用AWK从Web日志中收集IP和用户代理信息?

时间:2013-04-21 06:09:57

标签: linux ubuntu sed awk log-analysis

我有一个日志文件,其中包含以下文字:

66.249.74.18 - - [21/Apr/2013:05:55:33 +0000] 200 "GET /1.jpg HTTP/1.1" 7691 "-" "Googlebot-Image/1.0" "-"
220.181.108.96 - - [21/Apr/2013:05:55:33 +0000] 200 "GET /1.html HTTP/1.1" 17722 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" "-"

我想将所有ip和用户代理信息收集到一个文件中:

66.249.74.18 "Googlebot-Image/1.0"
220.181.108.96 "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"

我怎么能用awk做到这一点?

我知道awk '{print $1}'可以列出所有ips,awk -F\" '{print $6}'可以列出所有用户代理,但我不知道如何将它们组合到输出中。

4 个答案:

答案 0 :(得分:2)

awk '{print $1,$6}' FPAT='(^| )[0-9.]+|"[^"]*"'
  • 将字段定义为
    • 从行或空格的开头开始
    • 后跟[0-9.]+"[^"]*"
  • 然后打印字段1和6

答案 1 :(得分:1)

不使用GNU扩展的可移植方法:

awk '{printf "%s ",$1;for(i=12;i<NF;i++)printf "%s ",$i;printf "\n"}' file

答案 2 :(得分:1)

awk -F' - |\\"' '{print $1, $7}' temp1

输出:

66.249.74.18 Googlebot-Image/1.0
220.181.108.96 Mozilla/5.0 (compatible;Baiduspider/2.0;+http://www.baidu.com/search/spider.html)

temp1文件:

66.249.74.18 - - [21/Apr/2013:05:55:33 +0000] 200 "GET /1.jpg HTTP/1.1" 7691 "-" "Googlebot-Image/1.0" "-"
220.181.108.96 - - [21/Apr/2013:05:55:33 +0000] 200 "GET /1.html HTTP/1.1" 17722 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"     "-"

答案 3 :(得分:0)

使用perl

perl -nle '/^((?:\d+\.?){4})(?:.+?"){4}\s+(".*?")/ && print "$1 $2"' access_log

诀窍在于计算不是双引号+双引号的字符(?:.+?"){4}。这是正则表达式的可视化描述:https://regex101.com/r/xP0kF4/4

正则表达式比以前的答案更复杂,但我们可以轻松地解析其他属性。