Shell-Script

如何使過濾器更有效

  • January 6, 2015

我創建了一個腳本來將 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或其他內容。

引用自:https://unix.stackexchange.com/questions/177519