Shell-Script
如何使過濾器更有效
我創建了一個腳本來將 MSSQL 數據庫中的使用者列表與禁用的 AD 使用者列表進行比較。我們用於 AD 身份驗證的工具以以下格式返回數據(列之間有更多的空格),因此為了允許比較(在 python 中)需要解析數據:
User info (Level-2): ==================== Name: domain\username UPN: UserName@domain.local 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
我不知道它是否更有效,但你可以完全做到這一點
awk
:awk -F': *' '$1 == "Name" {name = $2; next}; $0 == "Account disabled (or locked): TRUE" { print gensub(/.*\\/, "", 1, name) }'
你應該完全這樣做,
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]$
…並且下一個以字元串Account開頭的行應該以字元串TRUE結尾,後跟任意數量的空格,並且一個無趣的組可能會有FALSE或其他內容。