Cómo hacer un filtro más eficiente

Cómo hacer un filtro más eficiente

Creé una secuencia de comandos para comparar una lista de usuarios de una base de datos MSSQL con una lista de usuarios de AD deshabilitados. La herramienta que utilizamos para la autenticación AD devuelve datos en el siguiente formato (con muchos más espacios en blanco entre las columnas), por lo que para permitir la comparación (en Python), es necesario analizar los datos:

User info (Level-2):
====================
Name:                         domain\username
UPN:                          [email protected]
Generated UPN:                NO
DN:                           DN....
Uid:                          123456
Gid:                          123456
Gecos:                        User Name
Shell:                        /shell/path
Home dir:                     /homedir
Other attributes:         ....
Other attributes:         ....
Account disabled (or locked): TRUE
Other attributes:         ....
Other attributes:         ....
Other attributes:         ....
etc

Desde la línea de comando, lo siguiente funciona, sin embargo, es muy complicado y espero que alguien pueda sugerir un método más limpio. Experimenté con awk pero no tuve mucho éxito al reducir el tamaño del comando:

/opt/util/enum-users --level 2 |
grep "Name:\|Account disabled (or locked): TRUE" |
grep -x "Account disabled (or locked): TRUE" -B 1 |
grep "Name:" |
sed -r 's/^.{35}//'

Esto genera los datos según sea necesario:

username
username
etc

Respuesta1

No sé si es más eficiente, pero puedes hacer esto completamente en awk:

awk -F': *' '$1 == "Name" {name = $2; next}; 
$0 == "Account disabled (or locked): TRUE" {
   print gensub(/.*\\/, "", 1, name)
}'

Respuesta2

Deberías hacer esto por sedcompleto ya que lo estás usando de todos modos:

/opt/util/enum-users --level 2 |
sed -n '/^Name:/h;//,/^Account/{
    /^Account/!d;/TRUE[^:]*$/!d;g
    s/^[^:]*:[[:blank:]]*//p
}' 

En realidad, no sé cómo [[:blank:]]se debe manejar el negocio, pero la suposición anterior es que un grupo de líneas interesante probablemente comenzará así:

^Name:[[:blank:]]*[INFORMATION YOU WANT]$

...y que la siguiente línea que aparece comenzando con la cadenaCuentadebe terminar con la cuerdaVERDADEROseguido de cualquier número de espacios en blanco y que un grupo poco interesante probablemente tendráFALSOo algo.

información relacionada