Escrevendo um script para executar automaticamente contra variáveis consecutivas

0

Estou tentando converter um formato de endereço mac para outro, por exemplo, de XXXX:XXXX:XXXX para XX:XX:XX:XX:XX:XX .

Consegui criar uma string sed usando padrões, mas só posso executá-la por endereço mac. Alguma sugestão sobre como automatizar o script para executá-lo contra endereços mac consecutivos?

Veja um exemplo:

$ echo  5254.0040.8beb | sed  's/\.//g' |  sed -e 's/\([0-9A-Fa-f]\{2\}\)/:/g' -e 's/\(.*\):$//'
52:54:00:40:8b:eb

Eu não quero executá-lo 100x: /

    
por cyv 05.10.2015 / 22:49

3 respostas

1

A maneira de fazer isso é salvar todos os seus endereços MAC em um arquivo e, em seguida, executar o comando sed no arquivo. O seu é desnecessariamente complexo, tente isso:

$ echo 5254.0040.8beb | sed 's/\.//g; s/../&:/g; s/:$//'
52:54:00:40:8b:eb

O primeiro s/// remove o . , o segundo substitui cada conjunto de 2 caracteres ( .. ) por si ( & ) e um : , e o terceiro remove o : que o substituição anterior adicionada ao final da linha.

Para rodar isso no seu arquivo de endereços MAC (um endereço por linha), faça:

sed 's/\.//g; s/../&:/g; s/:$//' file
    
por terdon 06.10.2015 / 00:02
1
$ echo 5254.0040.8beb | sed -r 's/\./:/g; s/([[:xdigit:]]{2})([[:xdigit:]]{2})/:/g'
52:54:00:40:8b:eb
    
por glenn jackman 05.10.2015 / 23:19
1

Abordagem com awk: para trabalhar com caracteres individuais, defina o separador de campo como em branco, elimine o ponto no endereço MAC original e imprima ponto após cada segundo caractere. Para um único endereço MAC, o código ficará assim:

echo 5254.0040.8beb  | awk -F '' '{gsub(/\./,"");for(i=1;i<=NF;i++){printf $i;if(i%2 == 0 && i!=NF) printf ":"   }}'

Podemos transformar o código em um script executável, da seguinte forma:

  1. crie um arquivo chamado mac-editor.awk . Seu conteúdo está no arquivo abaixo
  2. Torne o script executável com chmod 755 mac-editor.awk ;
  3. Execute o código com o arquivo de entrada como um argumento assim

    ./ mac-editor.awk input-file.txt

Conteúdo do script AWK

#!/usr/bin/awk -f
BEGIN {
FS="";
}

{
 gsub(/\./,"");
 for(i=1;i<=NF;i++){
   printf $i;
   if(i%2 == 0 && i!=NF) 
      printf ":"   
 };
 printf "\n";
}

Demo :

A demonstração abaixo mostra como o script se comporta com um arquivo de entrada no qual você tem uma lista de endereços MAC, um por linha.

$ cat mac-addresses.txt                                                        
7ab1.34b9.2eb0
2689.373c.d131
d271.a9a2.14c4

$ mac-editor.awk mac-addresses.txt                                             
7a:b1:34:b9:2e:b0
26:89:37:3c:d1:31
d2:71:a9:a2:14:c4
    
por Sergiy Kolodyazhnyy 06.10.2015 / 00:57