Как сделать фильтр более эффективным

Как сделать фильтр более эффективным

Я создал скрипт для сравнения списка пользователей из базы данных MSSQL со списком отключенных пользователей AD. Инструмент, который мы используем для аутентификации AD, возвращает данные в следующем формате (с большим количеством пробелов между столбцами), поэтому для возможности сравнения (в Python) данные необходимо проанализировать:

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

Из командной строки следующее делает свое дело, однако это очень грязно, и я надеюсь, что кто-нибудь сможет предложить более чистый метод. Я экспериментировал с awk, но не добился большого успеха в уменьшении размера команды:

/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}//'

Это выводит данные по мере необходимости:

username
username
etc

решение1

Я не знаю, эффективнее ли это, но вы можете сделать это полностью за awk:

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

решение2

Вам следует просто сделать это sedполностью, поскольку вы все равно его используете:

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

На самом деле я не знаю, как [[:blank:]]следует вести этот бизнес, но сделанное выше предположение заключается в том, что интересная линейная группа, вероятно, начнется примерно так:

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

...и что следующая встречающаяся строка начинается со строкиСчетдолжен заканчиваться строкойистинныйза которым следует любое количество пробелов, и что неинтересная группа, вероятно, будет иметьЛОЖЬили что-то.

Связанный контент