Script Bash para substituir algumas palavras presentes em um arquivo de outro arquivo

1

Eu tenho dois arquivos, um, file1 é de 1000 linhas com configurações de roteador. Uma parte disso é assim -

 !
 ipv6 prefix-list CCAV6 seq 5 permit 2217:AB23::/40
 route-map DENY-ALL deny 11
 !
 ip pim sparse-mode
 ipv6 address 2617:FB23:0:1::1/128
 ipv6 ospf 1 area 0.0.0.0

e assim por diante. Meu segundo arquivo file2 é um mapeamento de endereços ipv6 para ipv4. Parece assim -

 2617:FB23:0:1::1/128 245.82.242.31/32
 2217:AB23::/40 64.211.7.157/31

Eu quero substituir o traverse file1 e, se minha primeira coluna de file2 corresponder a qualquer parte de file1 , ela deverá ser substituída pela segunda coluna de file2

por exemplo, a saída que espero ver após o processamento seria -

!
ipv6 prefix-list CCAV6 seq 5 permit 64.211.7.157/31
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 245.82.242.31/32
ipv6 ospf 1 area 0.0.0.0

Eu tentei usar awk , mas todas as opções que eu encontrei parecem requerer conhecimento prévio da posição da replicação e a posição da primeira coluna não permanece a mesma através de file1 . Eu apreciaria algumas idéias.

    
por Zzrot 19.04.2016 / 03:31

3 respostas

0
#!/bin/bash
IFS=$'\n'
line='cat ./file2'
for var in $line 
do
string1='echo $var |awk '{print $1}''
string2='echo $var |awk '{print $2}''
sed -i "s#${string1}#${string2}#g" ./file1
done

Você precisa fazer o backup de file1 antes de executar isso.

    
por 19.04.2016 / 06:56
1

Se você não está muito incomodado com os separadores de campos de espaços múltiplos / guias de file1 sendo substituídos por espaços únicos:

awk 'NR == FNR{a[$1]=$2; next}; 
  {for (i=1; i<=NF; ++i) printf "%s%s", $i in a?a[$i]: $i, i == NF?"\n": " "}' file2 file1

rendimentos

!
ipv6 prefix-list CCAV6 seq 5 permit 64.211.7.157/31
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 245.82.242.31/32
ipv6 ospf 1 area 0.0.0.0
    
por 19.04.2016 / 05:50
1

O script a seguir lerá cada uma das duas primeiras palavras em um hash e, em seguida, substituirá o IPV6 pelo IPV4 e interromperá a verificação de outros padrões, se você considerar que dois endereços podem existir na mesma linha, remova if (j>0) break , do código.

código mixaddr

#!/usr/bin/nawk -f
BEGIN{while (getline<"map"){w[$1]=$2}}
{for (a in w){
    j=gsub(a,w[a])
    if (j>0) break
    }
    print
}

arquivo de mapeamento

2617:FB23:0:1::1/128 245.82.242.31/32
2217:AB23::/40 64.211.7.157/31

arquivo de hosts

!
ipv6 prefix-list CCAV6 seq 5 permit 2217:AB23::/40
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 2617:FB23:0:1::1/128
ipv6 ospf 1 area 0.0.0.0

Execução

mixaddr hosts
!
ipv6 prefix-list CCAV6 seq 5 permit 64.211.7.157/31
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 245.82.242.31/32
ipv6 ospf 1 area 0.0.0.0

HTH

    
por 19.04.2016 / 06:54

Tags