フィルタ効率を向上させる方法

フィルタ効率を向上させる方法

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]$

...そして次の行は文字列で始まります。アカウント文字列で終わらなければならない本物その後に複数のスペースがある場合は、退屈なグループがある可能性があります。間違ったまたは他のもの。

関連情報