msoliver
(usa Debian)
Enviado em 22/04/2022 - 21:44h
diego_fs28 escreveu:
Boa tarde, pessoal
Estou com a seguinte dúvida, possuo alguns arquivos de logs no qual quero fazer a limpeza das entradas com mais de 7 dias, estou tentando através do SED mais o mesmo não está deletando as linhas que possuem a data que eu repassei através da variavel. No caso quero deletar as entradas de log que contenham como data 5 dias atrás, porém o mesmo não deleta.
Segue script:
#!/bin/bash
data=$(date -d "5 days ago" +20%y-%m-%d)
sed -i "/$data/d" /home/diego/scripts/teste/*.json*
Segue estilo de linha do log que quero deletar:
{"log":"{\"t\":{\"$date\":\"2022-03-10T17:49:10.448+00:00\"},\"s\":\"I\", \"c\":\"NETWORK\", \"id\":22944, \"ctx\":\"conn1\",\"msg\":\"Connection ended\",\"attr\":{\"remote\":\"172.18.0.3:42382\",\"uuid\":\"17964d9c-03c9-47de-b711-ad843b90624d\",\"connectionId\":1,\"connectionCount\":0}}\n","stream":"stdout","time":"2022-03-10T17:49:10.448827089Z"}//
Boa noite,
A solução é mais complexa.....
O comando:
data=$(date -d "5 days ago" +20%y-%m-%d)
sed -i "/$data/d" /home/diego/scripts/teste/*.json*
Deleta somente as linhas que tem o conteúdo da var data, que é:
2022-04-17 .
Sugestão:
defina o limite da data:
lim=$(date -d"-7 days" +%s)
Use a função "mktime" do gawk para converter a data do log em Unix Time,
Dessa forma, compare as "datas",
Exemplo:
cat log.txt
#exclui as aspas duplas para facilitar o teste
{log:{t:{$date:2022-04-17T17:49:10.448+00:00},s:I, c:NETWORK, id:22944, ctx:conn1,msg:Connection ended,attr:{remote:172.18.0.3:42382,uuid:17964d9c-03c9-47de-b711-ad843b90624d,connectionId:1,connectionCount:0}},stream:stdout,time:2022-03-10T17:49:10.448827089Z}
{log:{t:{$date:2022-04-16T17:49:10.448+00:00},s:I, c:NETWORK, id:22944, ctx:conn1,msg:Connection ended,attr:{remote:172.18.0.3:42382,uuid:17964d9c-03c9-47de-b711-ad843b90624d,connectionId:1,connectionCount:0}},stream:stdout,time:2022-03-10T17:49:10.448827089Z}
{log:{t:{$date:2022-04-18T17:49:10.448+00:00},s:I, c:NETWORK, id:22944, ctx:conn1,msg:Connection ended,attr:{remote:172.18.0.3:42382,uuid:17964d9c-03c9-47de-b711-ad843b90624d,connectionId:1,connectionCount:0}},stream:stdout,time:2022-03-10T17:49:10.448827089Z}
{log:{t:{$date:2022-04-15T17:49:10.448+00:00},s:I, c:NETWORK, id:22944, ctx:conn1,msg:Connection ended,attr:{remote:172.18.0.3:42382,uuid:17964d9c-03c9-47de-b711-ad843b90624d,connectionId:1,connectionCount:0}},stream:stdout,time:2022-03-10T17:49:10.448827089Z}
gawk -v lim=$(date -d"-7 days" +%s) -F'[:T.-]' '{uts=mktime($4" "$5" "$6" "$7" "$8" "$9);if(uts>lim) print uts,lim,"Manter";else print uts,lim,"Excluir"}' log.txt
1650228550 1650069055 Manter
1650142150 1650069055 Manter
1650314950 1650069055 Manter
1650055750 1650069055 Excluir
Para alterar o arquivo com o gawk veja o comando "-i inplace"
Ex:
awk -i inplace -v INPLACE_SUFFIX=.bak -v lim=$(date -d"-7 days" +%s) -F'[:T.-]' '{uts=mktime($4" "$5" "$6" "$7" "$8" "$9);if(uts>lim) print $0;else print uts,lim,"Excluido"}' log.txt
INPLACE_SUFFIX=.bak gera um backup .
É isso!
______________________________________________________________________
Importante:
Se te ajudei, me ajude, Marcando o tópico como RESOLVIDO e
escolhendo a MELHOR RESPOSTA.
______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________