Excluir conteúdo de variavel dentro de arquivo via SED [RESOLVIDO]

1. Excluir conteúdo de variavel dentro de arquivo via SED [RESOLVIDO]

Diego Faleiros dos Santos
diego_fs28

(usa Ubuntu)

Enviado em 22/04/2022 - 16:07h

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"}//




  


2. MELHOR RESPOSTA

Marcelo Oliver
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
______________________________________________________________________


3. Re: Excluir conteúdo de variavel dentro de arquivo via SED [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 26/04/2022 - 17:08h

Diego, boa tarde e obrigado pela Melhor Resposta.
Segue mais uma opção:
Gerando arquivo para testes:
printf "%s\n" {1..30}|xargs -in  date -d"2022-03-31 n day" +%Y-%m-%d:%H:%M:%S > data.txt 

Gera Regex, dos ultimos 5 dias, contando com o dia atual.
regex=$(printf "%s\n" {-4..0}|xargs -IX date -d"X days" +%Y-%m-%d|paste -sd'|') 

Busca no arquivo
grep -E "($regex)" data.txt
Ou
sed -nr "/($regex)/p" data.txt
2022-04-22:00:00:00
2022-04-23:00:00:00
2022-04-24:00:00:00
2022-04-25:00:00:00
2022-04-26:00:00:00


Usando o sed para excluir do arquivo
sed -nri "/($regex)/p" data.txt

Fica a sugestão....

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts