nombre de dispositivo grep y search el siguiente valor:

Tengo este resultado de un command de búsqueda:

abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23 

donde abc, def y geh son nombres de dispositivo y podrían ser de cualquier longitud y otros son direcciones IP pertenecientes a dispositivos. Como abc,10.11.13.14 para el dispositivo abc . IP debe estar al lado del delimitador de comas.

¿Cómo puedo usar sed, grep o awk para imprimir la dirección IP asociada cuando busco el nombre de un dispositivo? En resumen, quiero que la IP se muestre junto al nombre del dispositivo.

Estoy más cómodo con awk, así que me gustaría presentar dos soluciones en awk.

Solución 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 

En este caso, estoy buscando un nombre de máquina "def", si se encuentra, imprima la siguiente columna.

Solución 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 

En esta solución, uso el command tr para convertir comas en una nueva línea, search "def" e imprimir la línea que sigue. Espero que estas soluciones funcionen para ti.

Suponiendo que tiene GNU grep con expresiones regulares compatibles con Perl:

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

Lo que significa: encontrar el contenido entre "def", en un lado y "una coma o final de línea" en el otro

EDITAR: agregó un límite de palabras a la RE para encontrar el dispositivo dado con mayor precisión.

Sin usar ningún command sino shell builtins:

 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" 

Con zsh, es fácil mapear esa cadena a una matriz asociativa:

 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] 

Usando grep (GNU) y 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 

Sustituya cada dirección IP [0-9\.]\{7,15\} usando sed. Una dirección IP consta de numbers y puntos, que varían de 7 a 15 posiciones.

Reemplace cada dirección IP con una línea nueva \n , lo que básicamente significa que cada dispositivo, combinación de IP tendrá su propia línea.

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