Como extrair domínios exclusivos de access.log?

1

Aqui está uma parte de um arquivo access.log grande que eu quero analisar:

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"

Eu estou querendo saber como extrair domínios exclusivos do arquivo. O resultado deve ser:

http://my.example.com
http://somedomain.com;
http://demo.otherdomain.com/blog;
    
por supermario 25.12.2016 / 10:28

3 respostas

3

Em situações como essa, eu sou um grande fã do grep usando lookarounds do Perl

grep -oP '(?<=http://).*(?=;)' access.log | sort -u

retornará uma lista usando sua amostra da seguinte forma

$ grep -oP '(?<=http://).*(?=;)' access.log | sort -u
demo.otherdomain.com/blog
my.example.com
somedomain.com
    
por 25.12.2016 / 11:00
1
 awk '{for(i=1;i<=NF;i++)if($i ~ /^http:\/\//)print $i}' access.log |sort -u

Se você deseja analisar https , então

awk '{for(i=1;i<=NF;i++)if($i ~ /^http(s)?:\/\//)print $i}' access.log |sort -u

Você também pode usar tr para remover o ponto e vírgula à direita

awk '{for(i=1;i<=NF;i++)if($i ~ /^http(s)?:\/\//)print $i}' access.log |tr -d ';' |sort -u
    
por 25.12.2016 / 11:04
0
awk '{ print $13 }' access.log | sort -u

Como uma tentativa básica, eu acho. O awk escolherá o 13º campo de cada linha, usando o espaço em branco como um delimitador, e será canalizado para o tipo que classificará as urls e removerá múltiplos ( -u para uniq).

Se apenas algumas linhas tiverem as informações, ou elas não serão todas nesse formato, será necessário primeiro definir o arquivo para selecionar em quais linhas isso é aplicável.

    
por 25.12.2016 / 10:43