我有一个日志文件,其中包含以下文本:
200“GET /1.jpg HTTP / 1.1”7691“ - ”“Googlebot-Image / 1.0”“ - ” 200“GET /1.html HTTP / 1.1”17722“ - ”“Mozilla / 5.0(兼容; 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(兼容; Baiduspider / 2.0; + http://www.baidu.com/search/spider.html)”
我怎样才能用awk做到这一点?
我知道awk '{print $1}'
可以列出所有ips和awk -F\" '{print $6}'
可以列出所有用户代理,但我不知道如何将它们合并到输出中。
不使用GNU扩展的便携式方法:
awk '{printf "%s ",$1;for(i=12;i<NF;i++)printf "%s ",$i;printf "\n"}' file
awk '{print $1,$6}' FPAT='(^| )[0-9.]+|"[^"]*"'
[0-9.]+
或"[^"]*"
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)" "-"
使用perl
:
perl -nle '/^((?:\d+\.?){4})(?:.+?"){4}\s+(".*?")/ && print "$1 $2"' access_log
诀窍在于计算不是双引号+双引号的字符 : (?:.+?"){4}
。这是对正则表达式的可视化描述: https : //regex101.com/r/xP0kF4/4
正则表达式比以前的答案更复杂,但我们可以轻松解析其他属性。