Extraindo parte de uma coluna de arquivo

3

Eu quero extrair parte de uma coluna de arquivo de log que é assim:

xx.xxx.xx.xx#59796:

Editar:

Esta é a linha de registro atual:

Jan 10 17:38:11 server named[747]: client 21x.x0.x8x.xxx#40649: view external: query (cache) 'domain.TLD/A/IN' denied

A parte antes do "#" na linha acima é um endereço IP, e eu quero extrair apenas o IP. A parte depois do "#" é números aleatórios e nem sempre iguais.

Eu uso o comando abaixo para definir um padrão, extrair a coluna IP e redirecionar a saída para o arquivo de texto, mas depois preciso usar um editor para deixar de fora os caracteres extras da coluna extraída.

grep -E 'view external.*denied' /var/log/messages |awk '{print $7}' > view_external_denied_ip.txt

Se eu puder extrair apenas o IP sem os caracteres extras na coluna, usaria o comando sort para classificá-los (sort | uniq -c | sort -rn).

    
por archmicht 10.01.2014 / 18:44

3 respostas

2

Eu posso dar uma resposta melhor se você mostrar sua entrada real, mas se tudo que você precisa é remover os caracteres depois de # (inclusive), use qualquer um deles (supondo que suas linhas contenham apenas um # ):

awk '/view external.*denied/{print $7}' logfile | sed 's/#.*//'

ou

awk '/view external.*denied/{print $7}' logfile | cut -d '#' -f 1
    
por 10.01.2014 / 19:05
1

Você pode fazer isso com um único comando sed. Primeiro, como estratégia geral, para extrair uma parte de uma linha em sed, use o comando s , com uma expressão regular que corresponde à linha inteira (começando com ^ e terminando com $ ), com o parte a reter em um grupo ( \(…\) ), substituindo toda a linha pelo conteúdo do (s) grupo (s) a manter. Passe a opção -n para desativar a impressão padrão e coloque o modificador p para imprimir linhas onde há algo para extrair. Você pode restringir ainda mais a extração prefixando o comando com um regex que deve corresponder à linha.

sed -n '/view external.*denied/ s/^.* client \([0-9.][0-9.]*\)#.*//p'

Se você preferir usar o awk, você pode usar sua função sub para remover uma parte de uma string.

grep -E 'view external.*denied' /var/log/messages |
awk '{sub(/#.*/, "", $7); print $7}'

Você também pode usar a função index para localizar a função # e substr para extrair a parte que deseja manter.

grep -E 'view external.*denied' /var/log/messages |
awk '{print substr($7, 1, index($7, "#"))}'

Você pode combinar facilmente o comando grep no comando awk.

</var/log/messages awk '/view external.*denied/ {sub(/#.*/, "", $7); print $7}'
    
por 11.01.2014 / 01:05
0
sed 's/\#.*$'//' /path/to/logfile # this will trim anything including and after a '#' on every line.
    
por 10.01.2014 / 18:58