remoção no local de linhas de registro com timestamps antigos

1

Bom dia. Eu tenho um arquivo de log que gostaria de excluir linhas com mais de 30 dias.

Conteúdo do arquivo:

2017/04/04 15:53:22 [11487] building file list
2017/04/04 15:53:22 [11487] done
2017/04/04 15:53:22 [11487] sent 163 bytes  received 12 bytes  350.00 bytes/sec
2017/04/04 15:53:22 [11487] total size is 48640  speedup is 277.94
2017/04/04 15:53:29 [11493] building file list
2017/04/04 15:53:29 [11493] done

Tentativa de usar o awk, mas não permite executar edições incorporadas no arquivo. Também não posso usar o gawk como uma solução, pois só tenho v 3.7.0. Esperava que alguém pudesse ajudar com sed talvez? Procurando por um forro de preferência. Isso é no bash.

    
por AfroJoe 05.05.2017 / 20:41

4 respostas

0
grep -v "$(date '+%Y/%m/%d' -d '30 days ago')*" logfile 
    
por 08.05.2017 / 16:03
1

Se você pode ter certeza de que haverá pelo menos uma entrada para cada dia, você pode dizer:

sed -n '\|'$(date +'%Y/%m/%d' -d '30 days ago')'|,$p' log

Desde que você tenha o GNU sed . Se não, você precisa escapar das barras na data.

    
por 08.05.2017 / 08:39
0

Se você tiver perl :

perl -MPOSIX -ni -e '
  BEGIN{$cutoff = strftime("%Y/%m/%d %T", localtime(time - 30*86400))}
  print if $_ ge $cutoff' file.log

Se você tem o GNU date :

file=file.log
{
  rm -f -- "$file" &&
    awk -v "cutoff=$(date -d '30 days ago' '+%Y/%m/%d %T')" '
      $0 >= cutoff' > "$file"
} < "$file"

Ambos em várias linhas para maior clareza, mas sinta-se à vontade para colocar uma linha se for necessário (você precisará de ; entre file.log e { e entre "$file" e } ao juntar as linhas da variante awk .

    
por 09.05.2017 / 10:07
0

Usando dateadd e dategrep de dateutils :

dategrep  -i "%Y/%m/%d %T" ">=$(dateadd now -30d)" </path/to/logfile

dateadd calcula o datetime daqui para 30 dias no passado. Então dategrep apenas imprime linhas de stdin que contêm uma string de data mais recente ou igual ( >= ) do que isso. O formato de data das linhas de log precisa ser especificado por -i neste caso.

    
por 09.05.2017 / 11:01