Não sei se é mais eficiente, mas você pode fazer isso totalmente em awk
:
awk -F': *' '$1 == "Name" {name = $2; next};
$0 == "Account disabled (or locked): TRUE" {
print gensub(/.*\/, "", 1, name)
}'
Eu criei um script para comparar uma lista de usuários de um banco de dados MSSQL com uma lista de usuários do AD desabilitados. A ferramenta que usamos para autenticação do AD retorna dados no seguinte formato (com muito mais espaço em branco entre as colunas), então, 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 faz o truque, 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
Você deve fazer isso com sed
totalmente, já que você está usando mesmo assim:
/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ócios deve ser tratado, mas a suposição feita acima é que um grupo de linhas interessante provavelmente começará assim:
^Name:[[:blank:]]*[INFORMATION YOU WANT]$
... e que a próxima linha que começa com a string Conta deve terminar com a string TRUE seguida por qualquer número de espaços em branco e que um grupo não interessante provavelmente tem FALSE ou algo assim.