如何从 access.log 中提取唯一域?

如何从 access.log 中提取唯一域?

这是我要分析的大型 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 文件,以选择适用于哪些行。

相关内容