Tengo un comando que devuelve lo siguiente:
id1="172" id2="17" id3="136" id4="5" id5="0" />
id1="172" id2="17" id3="128" id4="2" id5="0" />
id1="172" id2="17" id3="128" id4="4" id5="0" />
id1="172" id2="17" id3="128" id4="6" id5="0" />
Los primeros cuatro ID combinados representan una dirección IP (por ejemplo, 172.17.136.5
para la primera línea).
Me gustaría canalizar lo anterior a un comando de análisis que generará una sola cadena con todas las direcciones IP separadas por espacios.
Para el ejemplo anterior:
myVariable="172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6"
¿Cómo puedo hacer esto?
Respuesta1
Puedes hacer esto con un awk
comando más fácilmente:
your-command | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}'
Para configurarlo como una variable, use la sustitución de comandos:
myVariable="$(your-command | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}')"
-F
establece el separador del campo de entrada (que por defecto es cualquier espacio en blanco) en un valor personalizado; en este caso una comilla doble ( "
).
-v
le permite establecer awk
variables.
OFS
es el separador de campo de salida, por defecto un solo espacio. Lo fijamos en un punto.
ORS
es la salidaregistroseparador, por defecto una nueva línea. Lo configuramos en un espacio.
Luego imprimimos los campos 2, 4, 6 y 8 para cada línea de la entrada.
Salida de muestra:
$ cat temp
id1="172" id2="17" id3="136" id4="5" id5="0" />
id1="172" id2="17" id3="128" id4="2" id5="0" />
id1="172" id2="17" id3="128" id4="4" id5="0" />
id1="172" id2="17" id3="128" id4="6" id5="0" />
$ myVariable="$(cat temp | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}')"
$ echo "$myVariable"
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6
$
Respuesta2
myvariable=$(yourmysterycommand |
sed -e 's/id1=//;
s/id5=.*//;
s/"//g;
s/id.=/./g;
s/[[:blank:]]\+//g' |
paste -sd' ')
Es una frase breve, pero reformateada con nuevas líneas adicionales y sangría para facilitar la lectura.
$ echo "$myvariable"
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6
El sed
comando elimina la cadena id1=
, luego elimina id5=
todo lo que sigue, luego elimina todos los caracteres entre comillas dobles ( "
), cambia todas las apariciones de id.=
a un literal .
y finalmente elimina todos los caracteres en blanco (espacios y/o tabulaciones) de la línea.
El paste
comando une las líneas con un carácter de espacio como delimitador.
Por cierto, una mejor solución sería arreglar cualquier programa que esté imprimiendo direcciones IP en un formato tan inútil y tonto. Un octeto en una dirección IP no es ningún tipo de "id".