grep的多个同时模式

时间:2014-11-15 19:30:13

标签: bash grep

我需要查看/etc/passwd中是否存在用户。我使用grep,但是我很难将多个模式传递给grep。

我试过

if [[ ! $( cat /etc/passwd | egrep "$name&/home" ) ]];then
   #user doesn't exist, do something
fi

我使用的是&符号而不是|因为这两个条件必须是真的,但它不起作用。

2 个答案:

答案 0 :(得分:2)

尝试这样做:

$ getent passwd foo bar base

最后:

if getent &>/dev/null passwd user_X; then
    do_something...
else
    do_something_else...
fi

答案 1 :(得分:0)

与您的假设相反,正则表达式不会识别&的交集,即使它是一个逻辑扩展。

要找到与多个模式匹配的行,请尝试

grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1' file

以任何顺序匹配模式,或切换到例如AWK:

awk '/pattern1/ && /pattern2/' file

(虽然在您的具体示例中,只需要"$name.*/home"就足够了,因为匹配必须始终按此顺序发生。)

顺便说一下,您的扭曲if条件可以重构为

if grep -q pattern file; then ...

if条件将一个命令作为参数,运行它并检查其退出代码。任何正确编写的Unix命令都写入此规范,并在成功时返回零,否则返回非零退出代码。 (另请注意,没有无用的cat - 几乎所有命令都接受文件名参数,而那些不能使用重定向处理的命令。)