
Я создал скрипт для сравнения списка пользователей из базы данных 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]$
...и что следующая встречающаяся строка начинается со строкиСчетдолжен заканчиваться строкойистинныйза которым следует любое количество пробелов, и что неинтересная группа, вероятно, будет иметьЛОЖЬили что-то.