4

我有一个日志文件,其中包含如下文本:

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 (兼容;百度蜘蛛/2.0; +http:// /www.baidu.com/search/spider.html)" "-"

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

66.249.74.18“谷歌机器人图像/1.0”
220.181.108.96 "Mozilla/5.0(兼容;Baiduspider/2.0;+http://www.baidu.com/search/spider.html)"

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

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

4

4 回答 4

3
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)"     "-"
于 2013-04-22T09:43:29.550 回答
2
awk '{print $1,$6}' FPAT='(^| )[0-9.]+|"[^"]*"'
  • 定义一个字段为
    • 从行首或空格开始
    • 其次是[0-9.]+"[^"]*"
  • 然后打印字段 1 和 6
于 2013-04-21T07:00:50.020 回答
1

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

awk '{printf "%s ",$1;for(i=12;i<NF;i++)printf "%s ",$i;printf "\n"}' file
于 2013-04-21T10:16:51.943 回答
1

使用perl

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

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

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

于 2016-02-19T04:35:19.997 回答