我可以使用哪些命令来显示所有标识符(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