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