Não consigo descobrir como cortar esse arquivo e encontrar palavras exclusivas de uma seção específica

0

Portanto, há um arquivo de entrada de log de acesso chamado access_log e eu devo encontrar todos os arquivos exclusivos que foram acessados no servidor web. access_log é formatado assim, isso é apenas um trecho:

66.249.75.4 - - [14/Dec/2015:08:25:18 -0600] "GET /robots.txt HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.75.4 - - [14/Dec/2015:08:25:18 -0600] "GET /~robert/class2.cgi HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.75.4 - - [14/Dec/2015:08:30:19 -0600] "GET /~robert/class3.cgi HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
202.46.61.93 - - [14/Dec/2015:09:07:34 -0600] "GET / HTTP/1.1" 200 5208 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"

Os arquivos, por exemplo, no primeiro "robots.txt", são depois da palavra GET, HEAD ou POST. Eu tentei usar o comando cut usando "como o delimitador que não funcionou. Eu literalmente não tenho idéia de como separar os campos em um arquivo como este, para que eu possa compará-los. Se alguém puder me apontar na direção certa , Eu realmente aprecio isso.

Edit: Descobri isso, você estava certo @MichaelHomer. Minha sintaxe estava desligada e é por isso que o corte não estava funcionando para mim. Eu usei o espaço como o delimitador e funcionou.

    
por Michael Kiroff 10.04.2018 / 04:19

2 respostas

0

Aqui está uma explicação sobre o exemplo que você forneceu.

awk imprime colunas e linhas que você pode especificar. Sugiro que você revise a página man e o Google para obter mais referências. No seu caso, o delimitador é o espaço que separará cada coluna. Isso vai variar porque, no que você forneceu até agora, cada linha tem texto diferente, o que tornará o posicionamento das colunas diferente, mas para as três primeiras linhas, você pode começar com o seguinte:

cat access_log | awk 'NR==1,NR==3 {print $7}' | sort -u

NR==1,NR==3 Imprime as linhas de 1 a 3

{print $7} Imprime a sétima coluna que é o nome do arquivo que você precisa. Tenha em mente que nem sempre será a sétima coluna porque o texto em cada linha pode ser diferente.

sort -u Imprime valores exclusivos

A saída é:

/robots.txt
/~robert/class2.cgi
/~robert/class3.cgi

A última parte com sort não terá nenhum efeito no seu exemplo porque não há duplicatas, mas se o resto do arquivo não for, ele imprimirá somente valores únicos na coluna específica.

Se você quiser apenas imprimir o nome do arquivo, use o argumento substr com awk :

cat access_log | awk 'NR==1 {print substr($7,2,10)} NR==2,NR==3 {print substr($7,10,10)}'

A saída será:

robots.txt
class2.cgi
class3.cgi

Para explicar:

NR==1 {print substr($7,2,10)} Para a primeira linha no campo 7, a partir da segunda posição, são impressos 10 caracteres.

NR==2,NR==3 {print substr($7,10,10)} Para a segunda e terceira linhas no campo 7, a partir da décima posição, são impressos 10 caracteres.

Você provavelmente terá que modificar as colunas e os valores, pois o restante do arquivo provavelmente será diferente e nem sempre será alinhado na mesma posição, mas isso deve ajudá-lo a começar. Parece um pouco para absorver, mas um pouco de pesquisa vai levá-lo para a direção certa

    
por 10.04.2018 / 05:52
0

uma alternativa, que fornecerá uma contagem de cada hit de arquivo exclusivo:

awk '{print $7}' access_log | sort | uniq -c | sort -rn

ou se você quisesse hits em um dia específico, poderia marcar a data primeiro:

fgrep "14/Dec/2015" access_log | awk '{print $7}' | sort | uniq -c | sort -rn

um pouco relevante, você pode usar as opções acima para também encontrar visitantes únicos (pelo menos IPs exclusivos) em seu site, alterando a impressão de US $ 7 para US $ 1. Eu pessoalmente uso os mesmos comandos quando meus sites estão sendo DoS para encontrar quais IPs bloqueiam a rede.

    
por 10.04.2018 / 15:22

Tags