grep -v "$(date '+%Y/%m/%d' -d '30 days ago')*" logfile
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.
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.
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
.
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.
Tags text-processing sed