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

おすすめ記事