Quero localizar uma data que esteja em algum lugar em um log de 8 GB (texto).
Posso ignorar um pouco uma leitura sequencial completa e primeiro fazer divisões binárias do arquivo (tamanho) ou navegar de alguma forma no sistema de arquivos inodes
(sobre o qual sei muito pouco), para começar a ler de cada ponto de divisão, até encontrar um deslocamento adequado de por onde começar minha pesquisa de texto por uma linha que contenha a data?
tail
a leitura da última linha não usa uma leitura seqüencial normal, então, eu me pergunto se esse recurso está disponível de alguma forma no bash, ou eu precisaria usar Python ou C / C ++ ... mas estou especificamente interessado em uma bash
opção ..
bash
filesystems
text-processing
Peter.O
fonte
fonte
Respostas:
que .. não cria arquivos de divisão temporária, ignora blocos * 512 MB de dados a cada execução, lê 64 bytes dessa posição e limita a saída à primeira linha desses 64 bytes.
convém ajustar 64 para o que achar necessário.
fonte
dd
para isso ... É uma ótima ferramenta! :)Parece que você quer:
ou qualquer número de bytes que você deseja pular. O sinal de mais indica a cauda para medir desde o início do arquivo em vez do final. Se você estiver usando a versão GNU do tail, pode escrever isso como:
Para obter um número fixo de bytes após o corte, em vez de todo o restante do arquivo, basta passar pela cabeça:
fonte
dd
pula para um byte específico (como faztail
), mas é uma dor que codifica comprimentos de linha desconhecidos e, em seguida, uma chamada para sed para remover as linhas parciais principais ... Parece que a cauda | cabeça pode fazer isso sem dor (tão rápido?) . Eu não entendo como a cabeça pode desligar a torneira na cauda, mas parece :) Deve ser um caso de: Se a cabeça parar de receber, a cauda interrompe o envio (e interrompe a leitura). Deve voltar .. amanhã.tail
/head
também não consigo adivinhar os comprimentos das linhas. você precisa pular para a posição xe então pode olhar para a esquerda ou direita de x para a próxima\n
. não importa como o programa é chamado. portanto, nos dois casos, você pula para x e, em seguida, usahead
para procurar o próximo final de linha à direita.tail|head
oferece a possibilidade de não se preocupar em tudo sobredd
's count = val. Com 'dd', se eu não pegar dados suficientes, é "game over". A flexibilidade dos comprimentos das linhas arbitrárias é grande. Eu escrevi uma função para 'dd' que retorna a linha completa "próxima mais próxima" e seu deslocamento, mas eu preferiria evitar o problema de comprimento. Agora testei o tail | head, e ele inicialmente apresenta um bom desempenho (para compensar = 100 MB), mas diminui drasticamente para levar 2 minutos para um acesso em offset = 8 GB (eu possoawk
em 1 minuto) ... então é ótimo para menores de arquivo é .. Obrigado por me fazer ciente da combinação cauda / cabeça :)Eu tentaria algo assim para dividir o log em pedaços de 512MiB para uma análise mais rápida.
Se você estiver procurando pelo arquivo, o seguinte funcionará:
Use essa saída para determinar qual arquivo grep para sua data.
fonte
Aqui está o meu script, estou procurando a primeira linha onde o primeiro campo corresponde ao meu número. As linhas são classificadas de acordo com o primeiro campo. Uso o dd para verificar a primeira linha de blocos de 128K, depois pulo para o bloco e faço uma pesquisa. Melhora a eficiência, pois o arquivo ultrapassa 1 milhão.
Qualquer comentário ou correção é apreciado!
* EDIT * ** grep é muito mais rápido e aceita ainda melhor
fonte