Como tornar um filtro mais eficiente

Como tornar um filtro mais eficiente

Criei um script para comparar uma lista de usuários de um banco de dados MSSQL com uma lista de usuários deficientes do AD. A ferramenta que usamos para autenticação AD retorna dados no seguinte formato (com muito mais espaços em branco entre as colunas), portanto, para permitir a comparação (em python), os dados precisam ser analisados:

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

Na linha de comando, o seguinte funciona, mas é muito confuso e espero que alguém possa sugerir um método mais limpo. Eu experimentei o awk, mas não tive muito sucesso em reduzir o tamanho do 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}//'

Isso gera os dados conforme necessário:

username
username
etc

Responder1

Não sei se é mais eficiente, mas você poderia fazer isso inteiramente em awk:

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

Responder2

Você deve fazer isso inteiramente, sedjá que o está usando de qualquer maneira:

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

Na verdade, não sei como o [[:blank:]]negócio deve ser tratado, mas a suposição feita acima é que um grupo de linhas interessante provavelmente começará como:

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

...e que a próxima linha que ocorra começando com a stringContadeve terminar com a stringverdadeiroseguido por qualquer número de espaços em branco e que um grupo desinteressante provavelmente teráFALSOou alguma coisa.

informação relacionada