フィルターをより効率的にする方法

フィルターをより効率的にする方法

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

...そして、次の行は文字列で始まりますアカウント文字列で終わる必要があります真実これに続く空白はいくつでも続くが、興味のないグループではおそらく間違いか何か。

関連情報