如何列出 UID 大于 10 的用户?

如何列出 UID 大于 10 的用户?

我可以使用哪些命令来显示所有标识符(UID)大于 10 的用户?

答案1

您可以解析passwd数据库使用awk。在passwd格式中,每个条目都是由 分隔的字段列表:,其中第一个字段是用户名,第三个字段是 UID。因此,在 awk 中,您可以执行以下操作:

getent passwd | awk -F: '$3 > 10 {print $1}'

答案2

解决方案1:

您可以使用:

#!/bin/bash
while IFS= read -r line; do
    [[ "$(cut -d: -f3 <<<"$line")" -gt 10 ]] && echo "$line"
done </etc/passwd

考虑到您没有包含 的用户名:

如果您只想要用户名:

#!/bin/bash
while IFS= read -r line; do
    [[ "$(cut -d: -f3 <<<"$line")" -gt 10 ]] && echo "$(cut -d: -f1 <<<"$line")"
done </etc/passwd

这里我们读取/etc/passwd文件的每一行并比较由(UID)分隔的第三个字段:以检查它是否大于 10。如果为真,我们就打印该行(或第二个脚本中的用户名)。

使用数组会简单得多(感谢 muru):

#!/bin/bash
while IFS=: read -a line; do
    [[ "${line[2]}" -gt 10 ]] && echo "${line[0]}"
done </etc/passwd

解决方案2:

grep与 PCRE 一起使用:

getent passwd | grep -P '^[^:]+:[^:]+:(?!(?:\d|10):)' | cut -d: -f1
  • ^[^:]+:将匹配第一个字段(用户名),包括尾随的:

  • [^:]+:将匹配第二个字段(密码),包括尾随:

  • (?!(?:\d|10):)部分比较棘手,它是 PCRE 的零宽度负向前瞻模式(grep -P),这意味着接下来没有单个数字(\d)或数字 10,后面跟着一个:

  • cut -d: -f1只会打印第一个字段(用户名)。

另外,您可以通过在正向前瞻模式内cut使用负向前瞻来避免这种情况(感谢 Avinash Raj):(?!)(?=)

getent passwd | grep -Po '^[^:]+(?=:[^:]+:(?!(?:\d|10):))'

解决方案3:

使用python

#!/usr/bin/env python2
with open('/etc/passwd') as f:
    print '\n'.join([line.split(':')[0] for line in f if int(line.split(':')[2]) > 10])

这里,如果第三个字段大于 10,我们将打印用户名。line.split(':')将按 拆分每行的字段:,使其成为字段列表。

答案3

使用 awk:

 awk -F: '{if ($3 > 10) { print $1 ":" $3 } }' /etc/passwd

这将列出所有用户及其关联的 UID,其中 UID > 10。

感谢@sadi 的注释,仅列出用户名

awk -F: '{if ($3 > 10) {print $1}}' /etc/passwd

相关内容