Redacte una cadena de IP usando la línea de comando bash

Redacte una cadena de IP usando la línea de comando bash

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.5para 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 awkcomando 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}')"

-Festablece el separador del campo de entrada (que por defecto es cualquier espacio en blanco) en un valor personalizado; en este caso una comilla doble ( ").

-vle permite establecer awkvariables.

OFSes el separador de campo de salida, por defecto un solo espacio. Lo fijamos en un punto.

ORSes 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 sedcomando 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 pastecomando 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".

información relacionada