Incrementar valor de retorno em um arquivo de configuração diariamente +1

2

Eu tenho um arquivo de configuração que precisa ser incrementado diariamente.

Por exemplo,

report.lookback.days.to.retrieve.data=60

Este arquivo contém várias entradas, como a acima, que contém valores diferentes. Eu preciso abrir a pesquisa do arquivo de propriedades para essa entrada específica e incrementar o valor por +1 a cada dia por um total de 30 dias.

Por exemplo,

report.lookback.days.to.retrieve.data=61

report.lookback.days.to.retrieve.data=62

report.lookback.days.to.retrieve.data=63

Sou novo no script e não sei qual método executaria essa tarefa.

Devo usar o awk, sed, implementar um contador ou uma combinação de métodos?

    
por user65231 14.04.2014 / 19:57

3 respostas

1

Se você quiser apenas editar o arquivo todos os dias, o que provavelmente não quer fazer, poderá fazer algo assim:

$ echo 'report.lookback.days.to.retrieve.data=61' \
    | awk -F= '
        /report.lookback.days.to.retrieve.data/{
            printf("%s=%d\n", $1, $2+1)
        }
    '
report.lookback.days.to.retrieve.data=62

Mas isso exigiria salvar em um arquivo temporário e substituir o original a cada vez. Como devnull mencionou, seria melhor substituir os valores por $vars e invocar o script com argumentos.

    
por 14.04.2014 / 20:11
1

Se você quiser apenas editar um arquivo que se parece com o que você postou, use algo como

perl -i  -pe 's/report.lookback.days.to.retrieve.data=\K\d+/$&+1/e' file

Explicação

O -i permite a edição no local, portanto, as alterações são salvas no arquivo original, -p significa "imprimir cada linha depois de executar qualquer script fornecido por -e" /

O s/// é o operador de substituição, funciona como s/source/replacement .

A expressão regular usada está procurando a string report.lookback.days.to.retrieve.data= seguida por um ou mais números ( \d+ ). O \K descarta o que foi correspondido antes, permitindo que $& , que é uma variável especial contendo o que foi correspondido, aponte apenas para os números.

Por fim, substituímos por $&+1 , o valor correspondente mais um. Isso (avaliando algo dentro do operador s/// ) é ativado pelo sinalizador s///e no final do s///e .

    
por 14.04.2014 / 20:12
0

Isto é muito simples de fazer com awk , no entanto, a abordagem padrão é a saída para um arquivo temporário e, em seguida, substituir o original, usando o Linux mktemp que você pode fazer:

tempfile=$(mktemp --tmpdir=.)
awk -F= '{
  if($1=="report.lookback.days.to.retrieve.data")
    print $1"="$2+1
  else
    print
  }' in_file >"$tempfile"
mv "$tempfile" in_file

Algumas versões de awk têm a opção -i (inplace), o que significa que você pode fazer:

awk -iF= '{
  if($1=="report.lookback.days.to.retrieve.data")
    print $1"="$2+1
  else
    print
  }' in_file

Ou se o utilitário sponge (parte de moreutils ) estiver disponível:

awk -F= '{
  if($1=="report.lookback.days.to.retrieve.data")
    print $1"="$2+1
  else
    print
  }' in_file |
sponge in_file

É claro que se o arquivo de entrada não contiver nenhuma outra linha além daquela que você deseja incrementar (ou se isso acontecer e você só quiser excluí-las), então a parte awk pode ser simplificada.

    
por 14.04.2014 / 20:21