我创建了一个脚本来将 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]$
...并且下一个出现的行以字符串开头帐户应该以字符串结尾真的后面跟着任意数量的空格,一个无趣的小组可能会有错误的或者其他的东西。