Use o awk diretamente:
awk '/\/g/ {
gsub(/\./, "", $2)
gsub(/../, "&:", $2)
sub(/:$/, "", $2)
print $2,$3
}'
Com esta solução, você não precisa de grep
nem sed
.
Estou tentando analisar um arquivo de texto gerado por um script expec puxa algumas informações de um switch.
Aqui está um exemplo de saída:
192 0000.0000.0000 1/g23 Dynamic
192 0000.0000.0000 ch1 Dynamic
192 0000.0000.0000 ch1 Dynamic
192 0000.0000.0000 ch1 Dynamic
O arquivo de texto tem muitos outros tipos de lixo que eu não estou interessado. Eu só quero as linhas que contêm o número do switch e a porta - "1 / g23" no exemplo acima.
Eu fiz um grep no arquivo para extrair as linhas que contêm o padrão '/ g' e funciona muito bem.
Agora, tudo o que quero são as duas colunas do meio. Eu usei o awk para imprimir as colunas.
0000.0000.0000 1/g23
Agora que isso é feito, eu quero pegar carona com o '.' sed funcionou bem para isso
000000000000 1/g23
A partir daqui, quero converter apenas a primeira coluna em um formato de endereço MAC.
So this
000000000000 1/g23
Becomes this
00:00:00:00:00:00 1/g23
Consegui encontrar um comando sed que faria isso. Mas o meu problema é que só preciso que seja feito na primeira coluna. Não tenho certeza de como posso editar apenas uma coluna e não perder a associação entre o MAC e a porta.
grep -e "/g" switch6output | awk '{print $2,$3}' | sed 's/\.//g' | sed 's/../&:/g;s/:$//'
Tenho certeza de que essa é uma maneira realmente estúpida de fazer isso, mas foi o melhor que consegui fazer. Existe uma maneira mais confiável de conseguir o que preciso sem perder a associação de portas e MAC?
Obrigado.
Apenas sed
exemplo:
sed -r '\=1/g23=!d;
s/[^ ]* *//;
s/ *[^ ]* *$//;
s/(..)\.(..)/:::/g;
s/::/:/'
Se sua entrada contiver guias em vez de espaços, você precisará ajustar as expressões.