在循环中使用egrep

时间:2014-09-10 04:49:37

标签: bash shell grep

我试图遍历用户名列表并打印出他们所属的群组,但省略了我不感兴趣的群组。但它无法正常工作。不,我不是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

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就足够了。

变异

有些人认为trsed更容易使用。对他们来说,这种替代方案可能更受欢迎:

results=$(groups "$line" | tr ' ' '\n' | egrep -v "_unknown|sciences|everyone|netaccounts")