Tengo lo siguiente en un archivo Output.dat. Necesito extraer el valor entre dn: uid=
y ,ou=
dn: uid=user1,ou=Active,ou=Member,dc=domain,dc=org
dn: [email protected],ou=Active,ou=Member,dc=domain,dc=org
dn: uid=usertest,ou=Active,ou=Member,dc=domain,dc=org
dn: uid=abc1,ou=Active,ou=Member,dc=domain,dc=org
- Intenté usar
sed -e '/dn: uid=/,/,ou=/p' output.dat but
devuelve una línea completa en lugar de un valor.
- Cuando intenté usar
sed -e '/dn: uid=/,/,ou=/1/p' output.dat
luego obtuve el siguiente error:
sed: -e expression #1, char 18: unknown command: `'
Respuesta aceptada:
Si tiene una versión de GNU grep con PCRE (-P
) soporte, suponiendo que te refieres al primero aparición de ,ou
grep -oP '(?<=dn: uid=).+?(?=,ou=)' file
Si desea hacer coincidir hasta el segundo ,ou
puede eliminar el ?
no codicioso modificador
grep -oP '(?<=dn: uid=).+(?=,ou=)' file
Las expresiones entre paréntesis son aserciones de longitud cero (también conocidas como miradas ) lo que significa que forman parte del partido, pero no se devuelven como parte del resultado. Podrías hacer lo mismo de forma nativa en Perl, por ejemplo.
perl -ne 'print "$1n" if /(?<=dn: uid=)(.+?)(?=,ou=)/' file
Es posible hacer algo similar en sed, utilizando agrupaciones regulares (de longitud distinta de cero), p. (para GNU sed:otras variedades pueden necesitar escapes adicionales)
sed -rn 's/(.*dn: uid=)([^,]+)(,ou=.*)/2/p' file
o simplificando ligeramente
sed -rn 's/.*dn: uid=([^,]+),ou=.*/1/p' file
Tenga en cuenta el [^,]
es un poco complicado aquí, ya que sed no tiene una verdadera opción de coincidencia no codiciosa.
Ideas posteriores :aunque no es exactamente lo que pediste, parece que lo que realmente quieres hacer es leer name=value
separados por comas pares de un archivo, y luego dividir aún más el valor del primer campo de su nombre. Puede lograrlo de muchas maneras, incluso
awk -F, '{sub(".*=","",$1); print $1}' file
o una solución puramente bash como
while IFS=, read -r a b c d; do printf '%sn' "${a#*=}"; done < file