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
@ 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)
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.
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!
LC_ALL=C grep
pode acelerar.grep
expressão sensata ... curingas de tamanho desconhecido (comoa.*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).Respostas:
Eu acho que você poderia usar tail para produzir apenas os últimos 4 GB usando o
-c
switchVocê provavelmente também poderia fazer algo com o dd , definindo
bs=1
e ajustandoskip
o deslocamento que deseja iniciar, por exemplofonte
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.
Eu também fiz uma referência muito rudimentar no mesmo arquivo. Eu testei:
o
tail
é apenas um pouco mais curto.NB: o sufixo usado
g
eG
difere por comando (Ubuntu 15.10)fonte
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:
fonte
tac
, então obrigado!