Como cortar parte do arquivo de log?

19

Eu tenho um arquivo de log de 8 Gb (log de produção do Rails). Eu preciso cortar entre algumas datas (linhas). Qual comando eu poderia usar para fazer isso?

    
por Eric Leschinski 25.02.2011 / 14:01

6 respostas

13

Algo como

sed '1,/last date prior to chunk/d;/first date after chunk/,$d' logfile | tee cut-log | less

tee cut-log permite que você veja na tela o que está sendo colocado no arquivo cut-log .

EDITAR:

Para satisfazer os padrões exatos do fred.bear, aqui está uma solução sed (embora a solução awk seja muito mais bonita):

b=BB; e=EE ;echo -e "AA\nAA\nBB\nBB\nCC\nCC\nDD\nDD\nEE\nEE\nFF\nFF" | sed -n ":b;/$b/b p;n;b b;:p;p;n;/$e/b e;b p;:e;p;n;/$e/b e;q"
    
por 25.02.2011 / 14:33
7

Para imprimir tudo entre FOO e BAR, tente:

$ sed -n '/FOO/,/BAR/p' file.txt
    
por 25.02.2011 / 15:00
5

Se no seu arquivo de registro você tiver as datas nesse formato YYYY-MM-DD , para localizar todas as entradas de, por exemplo, 2011-02-10, poderá fazer:

grep 2011-02-10 log_file

Agora, digamos, se você quiser encontrar as entradas para 2011-02-10 e 2011-02-11, use novamente grep , mas com vários padrões:

grep -E '2011-02-10|2011-02-11' log_file
    
por 25.02.2011 / 16:29
5

Isso fará o que você quiser ...
Ambas Incluindo e Excluindo as datas dos parâmetros são mostradas.

# set Test args
set  2011-02-24  2011-02-26  "junk"

from="$1"
till="$2"
file="$3"

# EITHER ====                              +++++++++  
# Ouptut lines between two parameter dates INCLUDING the parameter dates
  awk -v from=$from -v till=$till '
    ($2 >= from) && ($2 <= till) { print $0 ; next }
    ($2 > till) { exit }' "$file"

# OR ========                              ---------
# Ouptut lines between two parameter dates EXCLUDING the parameter dates
  awk -v from=$from -v till=$till '
    ($2 > from) && ($2 < till) { print $0 ; next }
    ($2 >= till) { exit }' "$file"

Ele testa uma data (classificada) no campo 2 ... Aqui está um exemplo dos dados de teste

    98  2011-02-05 xxxx
    99  2011-02-05 xxxx
   100  2011-02-06 xxxx
   101  2011-02-06 xxxx

E aqui está o gerador de dados de teste .

    
por 26.02.2011 / 21:56
0
perl -wlne '/^2011-02-24/ .. /^2011-02-25/ and print' log_file
    
por 25.02.2011 / 20:38
0

Trabalhar com esse tamanho de arquivos é sempre difícil.

Um caminho a seguir seria dividir esse arquivo em alguns pequenos, para fazer isso, você pode usar o comando split.

split -d -l 50000 ToBigFile.data file_

Mesmo tu está dividido você ainda pode trabalhar com o arquivo como se fosse um usando um bash para loop

for f in 'ls file_*'; do cat $f; done;

Mas, em vez do gato, você pode usar o grep invertido para se livrar de dados indesejados, o que é irrelevante para isso. (ou o tipo de refinamento que você precisa).

Neste ponto, você só trabalhará com vários arquivos menores e os comandos mencionados acima funcionarão em muitos arquivos menores.

E quando estiver pronto, você pode usar um segundo loop para criar o novo arquivo menor novamente.

for f in 'ls file_*'; do cat $f >> NewFile.data ; done;

Atualizar Como começamos a dividir os dados em vários arquivos, haverá muito trabalho com o disco rígido e isso levará tempo. (Nesta pergunta aparentemente 5min).

Por outro lado, os próximos passos provavelmente seriam mais rápidos.

Portanto, este método é provavelmente inútil para operações grep, awk, sed simples, mas se os padrões de pesquisa se tornarem mais complicados, poderá se tornar mais rápido.

    
por 01.03.2011 / 09:11