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

34

Preciso procurar algo em um enorme arquivo de log (mais de 14 GB). Tenho certeza de que está nos últimos 4 GB ou mais.

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

Roger
fonte
7
LC_ALL=C greppode acelerar.
JFS
11
Você será capaz de obter muita velocidade escolhendo uma grepexpressão sensata ... curingas de tamanho desconhecido (como a.*thing), em alguns casos, levarão muito mais tempo para serem avaliados. Pode ser que você esteja otimizando a coisa errada (embora nunca seja demais pesquisar apenas parte do arquivo, obviamente - pode não ser a melhor fonte de aceleração).
Floris

Respostas:

75

Eu acho que você poderia usar tail para produzir apenas os últimos 4 GB usando o -cswitch

-c, --bytes = [+] NUM gera
os últimos NUM bytes; ou use -c + NUM para produzir, começando com o byte NUM de cada arquivo

Você provavelmente também poderia fazer algo com o dd , definindo bs=1e ajustando skipo deslocamento que deseja iniciar, por exemplo

dd if=file bs=1024k skip=12g | grep something
user9517 suporta GoFundMonica
fonte
83
Depois, você deve configurar o logrotate.
Gerald Schneider
3
@ Roger Por favor, adicione uma resposta com a solução em vez de adicioná-la à sua pergunta. Isso é semelhante à resposta automática: serverfault.com/help/self-answer
AL
5
@istheEnglishway: Bem, não, eles postaram um comando diferente.
Lightness Races com Monica
11
Mas sua resposta não fornece o comando real que implementa essa solução, que é um valor agregado. Você pode editá-lo em sua resposta ou o OP pode publicá-lo como uma nova resposta. Eles definitivamente não deveriam adicioná-lo à pergunta, e foi o que aconteceu. E você definitivamente não deveria estar jogando epítetos como "enfiar o nariz".
Lightness Races com Monica
7
@istheEnglishway, acredite ou não ter um exemplo facilitar as coisas de ter que ler uma página de homem (ver também: documentação stackoverflow)
Pierre.Sassoulas
32

Só estou postando isso porque alguns dos comentários pediram.

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

tail -f -c 14G file | grep something

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

arquivo grep xxx
// demorou para sempre (> 5 minutos)

dd se = arquivo bs = 1 pular = 14G | grep xxx
// muito rápido <1 seg

cauda -c 14g | grep xxx
// bem rápido <2 seg

o tailé apenas um pouco mais curto.

NB: o sufixo usado ge Gdifere por comando (Ubuntu 15.10)

Roger
fonte
Você limpou o cache do disco entre os benchmarks? Eu suspeito que na maioria das vezes o primeiro foi de E / S. A aceleração deve ser da ordem de 15 ×, não 300 ×.
Reid
2
@ Reid eu não fiz. Mas eu executei cada comando várias vezes. Tenho certeza de que dd ou tail aumentará significativamente a velocidade do grep (cache ou não).
Roger
19

Isso não responde à pergunta do título, mas fará o que você deseja fazer. Use tac para reverter o arquivo e use grep para encontrar sua string. Se sua sequência ocorrer apenas uma vez ou um número conhecido de vezes no arquivo, deixe-a executar até encontrar o número conhecido de ocorrências. Dessa forma, se sua suposição sobre onde ele está no arquivo estiver incorreta, ela ainda o encontrará. Se você deseja limitá-lo, você pode usar head para fazer isso. O comando head iria entre o tac e o grep.

Portanto, o comando se parece com:

tac < logfile | grep myString
Itsme2003
fonte
11
Eu vim aqui para escrever exatamente a mesma resposta. Estou surpreso que ninguém tenha votado no seu.
Dmitry Grigoryev
2
Levei um minuto, mas então eu gemi com o trocadilho ... tac é o oposto de gato.
Sammi
11
Eu precisava cavar um log de aplicativo / depuração . Porque inverte as linhas, não está ficando mais fácil ler ;-) No entanto, parece muito rápido. Nunca vi tac, então obrigado!
Roger