2 votos

Cómo obtener valores después de un signo igual

Tengo un archivo delimitado con espacio y orden aleatorio de columnas de la siguiente manera:

 name=Joan age=42 ip=172.20.1.80 sex=M loc=UK 
loc=IR sex=F ip=172.20.1.1 age=32 name=Sandra 
 

Quiero extraer campos específicos ( name , loc y ip ) solamente.

Así que el resultado que estoy buscando es el siguiente:

 Joan|UK|172.20.1.80
Sandra|IR|172.20.1.1
 

4voto

Mike Puntos 1

Por suerte, el archivo de entrada tiene un formato de la shell entiende cuando se trata de la asignación de variables de un valor: var1=value1 var2=value2 etc. Por lo que simplemente puede leer cada línea y el uso de la eval comando para evaluar la línea.

Poner lo siguiente en un archivo, digamos parse.sh, do chmod +x parse.shy ejecuta con el archivo de entrada como un parámetro.

Guión parse.sh:

#!/usr/bin/env bash

while read line; do
    eval $line;
    echo "$name|$loc|$ip"
done < "$1"

exit 0;

Archivo input.txt:

name=Joan age=42 ip=172.20.1.80 sex=M loc=UK
loc=IR sex=F ip=172.20.1.1 age=32 name=Sandra

Ejecutar:

me@ubuntu:~> ./parse.sh input.txt 
Joan|UK|172.20.1.80
Sandra|IR|172.20.1.1

Por favor, tenga en cuenta que los valores no deben tener un espacio en ellos. E. g.

ip=... name=Ubai salih loc=...

no iba a funcionar y a dar errores de sintaxis. También, si el archivo de entrada contiene una línea con un bad_command que comando se ejecuta debido a que es cómo eval funciona: simplemente ejecuta la cadena dada.

1voto

Burnaby Puntos 57

FWIW, aquí hay una solución Python como la solución Bash de PerlDuck , pero sin evaluar la entrada.

 #!/usr/bin/env python3

import fileinput

for line in fileinput.input():
    record = line.rstrip('\n')
    d = dict(kv.split('=') for kv in record.split(' '))
    print(d['name'], d['loc'], d['ip'], sep='|')
 

Correr:

 $ ./parse.py input.txt
Joan|UK|172.20.1.80
Sandra|IR|172.20.1.1
 

0voto

steeldriver Puntos 19092

Dado que el orden de salida que desea es léxico inverso (nombre> loc> ip), puede seleccionar y luego ordenar los campos y luego eliminar los prefijos fieldname= . Por ejemplo en Perl:

 $ perl -alne '
    print join "|", map { s/.*=//r } reverse sort grep { /^(name|loc|ip)=/ } @F
' file
Joan|UK|172.20.1.80
Sandra|IR|172.20.1.1
 

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: