我试图遍历用户名列表并打印出他们所属的群组,但省略了我不感兴趣的群组。但它无法正常工作。不,我不是shell脚本专家。
#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH
# This script runs through list of user IDs
# and spits out the groups they belong to
while IFS= read -r line
do
GROUPSS=$(groups $line)
RESULT=$(egrep -v "_unknown|sciences|everyone|netaccounts" $GROUPSS)
echo $line $GROUPSS
done < $1
答案 0 :(得分:1)
考虑:
RESULT=$(egrep -v "_unknown|sciences|everyone|netaccounts" $GROUPSS)
在正则表达式之后,egrep
期望在其命令行上找到文件名。但是,上面的行为它提供了一个组列表。幸运的是,egrep
也可以接受来自stdin的输入。因此,我们可以在那里提供组列表。
但还有另一个问题。 egrep
一次在一行上运行,但GROUPSS
变量中的信息以空格分隔,而不是换行符。所以,我们需要改变它。
把所有这些放在一起:
while IFS= read -r line
do
result=$(groups "$line" | sed 's/ /\n/g' | egrep -v "_unknown|sciences|everyone|netaccounts")
echo $result
done < $1
在我的系统上,groups
返回用户名,后跟冒号,后跟组列表。管道不会删除用户名或冒号。因此,对于输出,使用echo $result
就足够了。
有些人认为tr
比sed
更容易使用。对他们来说,这种替代方案可能更受欢迎:
results=$(groups "$line" | tr ' ' '\n' | egrep -v "_unknown|sciences|everyone|netaccounts")