
我建立了一個腳本來將 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]$
...並且下一個出現的行以字串開頭帳戶應該以字串結尾真的後面跟著任意數量的空格,一個無聊的組別可能會有錯誤的或其他的東西。