if 语句在 etc/passwd 中查询用户 ID?

use*_*222 8 bash users text-processing etc passwd

使用 bash 我试图查询/etc/passwd任何 id 超过 1000 的用户。如果他们存在,做一些事情,否则做其他事情。我难住了。任何帮助表示赞赏。

if [ "$(id -u)" -gt "1000" </etc/passwd]; then
    do something
else
    do something else
fi
Run Code Online (Sandbox Code Playgroud)

Ste*_*uch 16

bash循环执行此操作,我建议使用readIFS喜欢:

#!/usr/bin/env bash
while IFS=':' read -r user passwd uid gid comment home shell;  do
    if [ "$uid" -gt 1000 ] ; then
        echo GT $user
    else
        echo LT $user
    fi
done < /etc/passwd
Run Code Online (Sandbox Code Playgroud)

  • 你评论中的关键词是*如果有*,问题是*for*和*they*。复数 *they* 向我表明您打算处理每个用户。但是这里的其他三个答案并没有这样读,所以...... (4认同)

ilk*_*chu 14

/etc/passwd您应该使用getent passwd,而不是直接阅读,如果您的某些用户保存在诸如 LDAP 之类的东西中,这也将起作用。awk应该非常适合冒号分隔的输出格式。

这将打印 UID > 1000 的所有用户的用户名:

getent passwd | awk -F: '$3 > 1000 {print $1}'
Run Code Online (Sandbox Code Playgroud)

found如果至少找到一个这样的东西,这只会打印:

getent passwd | awk -F: '$3 > 1000 {print "found"; exit}'
Run Code Online (Sandbox Code Playgroud)


Tom*_*ych 8

尝试这个:

if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'
Run Code Online (Sandbox Code Playgroud)

第一个grep搜索passwduid 为四位或更多位的行。第二个grep过滤掉 uid 1000 的行。如果有任何行,退出状态将为 0,否则为 1。

  • 从它的外观来看,这会查找长度至少为 4 个字符的 UID 字段,这在此处有效,但如果截止值不是 10 的幂,则不是很有用。如果某些数字由于某种原因得到前导零,结果也可能会令人困惑。 (4认同)