grep nome do dispositivo e procure pelo próximo valor:

3

Eu tenho essa saída de um comando de localização:

abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23

onde abc, def e geh são nomes de dispositivos e podem ser de qualquer tamanho e outros são endereços IP de dispositivos. Como abc,10.11.13.14 para o dispositivo abc . O IP deve estar ao lado do delimitador por vírgula.

Como eu posso usar sed, grep ou awk para imprimir o IP associado quando eu faço o grep para um nome de dispositivo? Em suma, quero que o IP seja exibido ao lado do nome do dispositivo.

    
por user28011 29.11.2012 / 08:35

5 respostas

3

Estou mais confortável com o awk, então gostaria de apresentar duas soluções no awk.

Solução 1

$ echo abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23 | awk -F, '{for (i=1; i<NF; i+=2) if ($i == "def") print $(i+1)}'
1.2.3.4

Neste caso, estou procurando um nome de máquina "def", se encontrado, imprima a próxima coluna.

Solução 2

$ echo abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23 | tr , \n | awk '/def/ {getline;print}'
1.2.3.4

Nesta solução, eu uso o comando tr para converter vírgulas em nova linha, procurar por "def" e imprimir a linha a seguir. Espero que estas soluções funcionem para você.

    
por 29.11.2012 / 08:52
3

Supondo que você tenha o GNU grep com expressões regulares compatíveis com Perl:

device="def"
grep -oP '(?<=\b'"$device"',).*?(?=,|$)'

O que significa: encontrar o conteúdo entre "def" de um lado e "uma vírgula ou fim de linha" do outro

EDIT: adicionou um limite de palavra ao ER para encontrar o dispositivo especificado com mais precisão.

    
por 29.11.2012 / 12:17
1

Sem usar nenhum comando, exceto os recursos internos do shell:

string='abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23'
dev=def

s=,$string,
case $s in
  (*,"$dev",*) ip=${s#*",$dev,"}; ip=${ip%%,*};;
  (*) ip=unknown
esac

printf '%s\n' "$ip"

Com o zsh, é fácil mapear essa string para um array associativo:

string='abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23'
typeset -A ip
ip=(${(s:,:)string})
print -r -- $ip[def]
    
por 29.11.2012 / 11:35
1

Usando grep (GNU) e corte:

$ echo abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23 | grep -o 'abc,[^,]*'  | cut -d, -f2
10.11.13.14
    
por 29.11.2012 / 09:28
0

Substitua cada endereço IP [0-9\.]\{7,15\} usando sed. Um endereço IP consiste em números e pontos, variando de 7 a 15 posições.

Substitua cada endereço IP por si mesmo seguido por uma nova linha \n , que basicamente significa que todos os dispositivos, combinação de IP, terão sua própria linha.

echo "abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23" | sed 's/\([0-9\.]\{7,15\}\),/\n/g' 
abc,10.11.13.14
def,1.2.3.4
geh,6.7.54.23


echo "abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23" | sed 's/\([0-9\.]\{7,15\}\),/\n/g'  | grep def
def,1.2.3.4
    
por 29.11.2012 / 08:55

Tags