GNU/Linux >> Tutoriales Linux >  >> Linux

¿Extraer valor entre dos patrones de búsqueda en la misma línea?

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 

Linux
  1. Cómo extraer el archivo tar.gz en Linux usando la línea de comandos

  2. ¿Imprimir líneas entre (y excluyendo) dos patrones?

  3. ¿Imprimir líneas entre (e incluyendo) dos patrones?

  4. ¿Cómo extraer registros entre dos marcas de tiempo?

  5. Scripting:¿cuál es la forma más fácil de extraer un valor en una etiqueta de un archivo XML?

Cómo quitar líneas de un archivo usando el comando Sed

Uso de Sed para buscar y reemplazar una línea entre rangos de patrones

Cómo extraer el archivo Tar.xz en la línea de comandos de Linux

Tutorial de Unix Sed:Impresión de líneas de archivos usando direcciones y patrones

Diferencia en espacios en blanco entre dos archivos en Linux

Usar sed para reemplazar entre un patrón específico