Eu tenho um arquivo de log de 8 Gb (log de produção do Rails). Eu preciso cortá-lo entre algumas datas (linhas). Qual comando eu poderia usar para fazer isso?
text-processing
logs
Eric Leschinski
fonte
fonte
sed
será fácil.Respostas:
Algo como
tee cut-log
permite ver na tela o que está sendo colocado no arquivocut-log
.EDITAR:
Para satisfazer os padrões exigentes de fred.bear, aqui está uma solução sed (embora a solução awk seja muito mais bonita):
fonte
sed
pode corresponderawk
à velocidade, e na verdade foi um pouco mais rápido.Para imprimir tudo entre FOO e BAR inclusive, tente:
fonte
Isso fará o que você deseja ...
Tanto a inclusão quanto a exclusão das datas dos parâmetros são mostradas.
Ele testa uma data (classificada) no campo 2 ... Aqui está um exemplo dos dados de teste
E aqui está o gerador de dados de teste .
fonte
awk -v from="$from" -v till="$till" '($2 >= from) { if ($2 <= till) { print } else { exit }' "$file"
if
instrução extra no total (nem mesmo uma por linha), ou seja. o fluxo lógico é efetivamente o mesmo, e a diferença no tempo de execução seria contada em nanossegundos .... A única razão pela qual não usei "else" é que esse é efetivamente meu primeiroawk
script de todos os tempos (além de um dia 4 anos atrás, quando brinquei com alguns exemplos) ... e esse é o primeiro mecanismo de ramificação viável que encontrei ... (e como mencionado. é tão rápido) .. Eu uso generosamente osed
Tryq
Se no seu arquivo de log você tiver as datas nesse formato
YYYY-MM-DD
, para encontrar todas as entradas, por exemplo, 10/02/2011, você pode:Agora, digamos, se você deseja localizar as entradas para 2011-02-10 e 2011-02-11, use novamente,
grep
mas com vários padrões:fonte
grep
irá procurar o arquivo inteiro, mesmo se a data gama está no início do arquivo. Em média, isso duplica o tempo de uma pesquisa, quando comparado a "sair após o último item do intervalo" ... Estou apenas me referindo a isso por causa do tamanho do arquivo de 8 GB mencionado na pergunta Os resultados do tempo de grep são quase idênticos ao exemplo sed aqui (1min 58seg). Aqui está o link para os resultados dos meus testes de tempo: paste.ubuntu.com/573477Trabalhar com esse tamanho de arquivo é sempre difícil.
Um caminho a seguir poderia ser dividir esse arquivo em alguns pequenos; para isso, você pode usar o comando split.
Mesmo que esteja dividido, você ainda pode trabalhar com o arquivo como se fosse um usando um loop bash for
Mas, em vez do gato, você pode usar grep invertido para se livrar de dados indesejados, o que é irrelevante para isso. (ou o tipo de refinamento necessário).
Nesse ponto, você trabalhará apenas com muitos arquivos menores, e os comandos mencionados acima funcionarão em muitos arquivos menores.
E quando terminar, você pode usar um segundo for loop para criar o novo arquivo menor novamente.
Atualização Desde que começamos a dividir os dados em vários arquivos, haverá muito trabalho com o disco rígido e isso leva tempo. (Nesta questão, aparentemente, 5min).
Por outro lado, os próximos passos provavelmente seriam mais rápidos.
Portanto, esse método provavelmente não faz sentido para uma operação simples grep, awk, sed, mas se os padrões de pesquisa se tornarem mais complicados, poderão se tornar mais rápidos.
fonte
fonte