Grep em um arquivo de log enorme (14 GB) apenas o último x GB?

34

Eu preciso pesquisar algo em um arquivo de log enorme (acima de 14 GB). Tenho certeza que é nos últimos 4 GB ou mais.

Existe uma maneira de ignorar o primeiro X GB para acelerar as coisas?

    
por Roger 31.01.2017 / 09:31

3 respostas

75

Eu acho que você poderia usar o final para produzir apenas 4GB ou mais por usando a opção -c

-c, --bytes=[+]NUM
output the last NUM bytes; or use -c +NUM to output starting with byte NUM of each file

Você provavelmente poderia fazer algo com dd definindo bs=1 e skip ing para o deslocamento que você deseja iniciar, por exemplo,

dd if=file bs=1024k skip=12g | grep something
    
por 31.01.2017 / 09:41
32

Estou apenas postando isso porque alguns dos comentários pediram por ele.

O que eu acabei usando foi (arquivo de 15 GB). Funcionou muito rápido e me poupou muito tempo.

tail -f -c 14G file | grep something

Eu também fiz uma referência muito rudimentar no mesmo arquivo. Eu testei:

grep xxx file
// took for-ever (> 5 minutes)

dd if=file bs=1 skip=14G | grep xxx
// very fast < 1 sec

tail -c 14g | grep xxx
// pretty fast < 2 sec

o tail é um pouco menor.

NB: o sufixo usado g e G difere por comando (Ubuntu 15.10)

    
por 01.02.2017 / 11:08
20

Isso não responde à pergunta do título, mas vai fazer o que você está querendo fazer. Use tac para inverter o arquivo e use grep para encontrar sua string. Se a sua string só ocorrer uma vez ou um número de vezes conhecido no arquivo, deixe-a rodar até encontrar o número conhecido de ocorrências. Dessa forma, se sua suposição sobre onde está no arquivo estiver incorreta, ela ainda será encontrada. Se você quiser limitá-lo, você pode usar a cabeça para fazer isso. O comando da cabeça iria entre o tac e o grep.

Então o comando parece:

tac < logfile | grep myString
    
por 01.02.2017 / 06:02