这是我要分析的大型 access.log 文件的一部分:
4.3.2.1 - - [22/Sep/2016:14:27:18 -0500] "GET / HTTP/1.0" 301 184 "-" "WordPress/4.5.4; http://my.example.com; verifying pingback from 127.0.0.1"-
4.3.2.1 - - [22/Sep/2016:14:27:18 -0500] "GET / HTTP/1.0" 301 184 "-" "WordPress/4.5.4; http://my.example.com; verifying pingback from 127.0.0.1"
3.2.1.4 - - [22/Sep/2016:14:27:18 -0500] "GET / HTTP/1.0" 301 184 "-" "WordPress/4.5; http://somedomain.com; verifying pingback from 1.2.3.4"-
3.2.1.4 - - [22/Sep/2016:14:27:18 -0500] "GET / HTTP/1.0" 301 184 "-" "WordPress/4.5; http://somedomain.com; verifying pingback from 1.2.3.4"
5.4.3.2 - - [22/Sep/2016:14:27:18 -0500] "GET / HTTP/1.0" 301 184 "-" "WordPress/4.4.2; http://demo.otherdomain.com/blog; verifying pingback from 1.2.3.4"
我想知道如何从文件中提取唯一的域。结果应该是:
http://my.example.com
http://somedomain.com;
http://demo.otherdomain.com/blog;
答案1
在这种情况下,我非常喜欢使用 Perl 环视的 grep
grep -oP '(?<=http://).*(?=;)' access.log | sort -u
将使用您的示例返回一个列表,如下所示
$ grep -oP '(?<=http://).*(?=;)' access.log | sort -u
demo.otherdomain.com/blog
my.example.com
somedomain.com
答案2
awk '{for(i=1;i<=NF;i++)if($i ~ /^http:\/\//)print $i}' access.log |sort -u
https
如果你也想解析的话
awk '{for(i=1;i<=NF;i++)if($i ~ /^http(s)?:\/\//)print $i}' access.log |sort -u
您也可以使用tr
删除尾随分号
awk '{for(i=1;i<=NF;i++)if($i ~ /^http(s)?:\/\//)print $i}' access.log |tr -d ';' |sort -u
答案3
awk '{ print $13 }' access.log | sort -u
我认为作为一个基本的尝试。 awk 将选择每行的第 13 个字段,使用空格作为分隔符,并将其通过管道传输到 sort,这将对 url 进行排序并删除多个(-u
对于 uniq)。
如果只有某些行包含信息,或者它们不会全部都是这种格式,您需要先 grep 文件,以选择适用于哪些行。