como substituir um valor por um cálculo em bash / sed

1

Eu usei o bash sed para substituir o endereço IP em um grupo de arquivos, i.e. 10.1.1.x = > 10.2.2.x-19:

file1: 10.1.1.29 => 10.2.2.10, 
file2: 10.1.1.30 => 10.2.2.11, 
file3: 10.1.1.31 => 10.2.2.12, 

etc.

Quase consegui:

for file in ifcfg* ; do sed -e "s/10.1.1./10.2.2./" $file >tmp/$file ; done

mas não conseguiu descobrir como calcular e substituir a última posição de endereço (x = > x-19)

provavelmente é muito fácil ...

    
por rookie 02.07.2013 / 16:24

4 respostas

1

Aqui está uma maneira de fazer isso:

$ for file in ifcfg*; do
    num=$(grep IPADDR $file|awk -F. '{print $4}')
    sed -e "s/10.1.1.[0-9]\+/10.2.2.$(($num-19))/" $file >tmp/$file
  done

Isso pega o conteúdo do endereço IP e o corta para baixo, de modo que é o quarto octeto, que é armazenado na variável $num . Essa variável é então adicionada com 19 durante o comando sed . Eu precisava expandir um sed original adicionando um [0-9]\+ para remover o quarto octeto existente para que pudéssemos substituí-lo por $num+19 .

    
por 02.07.2013 / 17:10
2

Você terá mais sorte fazendo isso com o awk ao invés de sed.

awk -F. '{printf ("%d.%d.%d.%d\n",$1,$2,$3,$NF-19)}'

ou de acordo com seu exemplo,

awk -F. '/10.1.1/ {printf ("10.2.2.%d\n",$1,$2,$3,$NF-19)}'

ou

for file in ifcfg*
do
    awk -F. '/10.1.1/ {printf ("10.2.2.%d\n",$1,$2,$3,$NF-19)}' $file >tmp/$file
done

Para preservar as outras linhas e assumir que x é o último elemento na linha a ser substituído, aqui está o que você faz

for file in ifcfg*
do
    awk -F. '/10.1.1/ {printf ("%s.%d.%d.%d\n",$1,2,2,$NF-19)}
             !/10.1.1/ {print $0}' $file > tmp/$file
done
    
por 02.07.2013 / 16:48
1
awk 'BEGIN{FS=OFS="."} {$NF -= 19; print $0 > ("tmp/" FILENAME)}' ifcfg*
    
por 24.07.2014 / 07:09
0

Eu usaria o perl para isso:

$ grep '10\.' file[123]
file1:10.1.1.29
file2:10.1.1.30
file3:10.1.1.31

$ perl -i -pe 's/10\.1\.1\.(\d+)/ "10.2.2." . ($1 - 19) /ge' file[123]

$ grep '10\.' file[123]
file1:10.2.2.10
file2:10.2.2.11
file3:10.2.2.12
    
por 02.07.2013 / 17:37

Tags