我对 Bash 脚本还很陌生,但我通过深入的谷歌搜索创建了这个
我正在尝试创建一个在 Ubuntu 上运行的 bash 脚本,它将检查用户列表并查找不在指定列表中的任何用户。到目前为止,我已经写了以下内容:
Cat /etc/passwd | grep -o -P'.{0,40}:1[0-9][0-9][0-9].{0,0}.' | cut -d: -f1
查看 passwd 文件,然后仅查找用户 ID 为 1000 或以上的行,并且每行用户 ID 之前的所有内容都通过管道传输到 cut 中,这将删除每个用户的用户名以外的所有内容。
然后我想让脚本检查文件中我指定的用户名(可能是从列表中复制的),并将每个用户名与上面的输出进行比较。删除所有指定的用户名。
例如:
我的电脑上有用户 John、Ben 和 Tom,如果我将 John 和 Ben 放在脚本正在访问的文件中,它应该输出 Tom,因为他没有被指定
我该如何做这件事?
答案1
该代码应该适合您。
for username in $( awk -F':' '$3 >= 1000 {print $1}' /etc/passwd )
do
if ! grep -q "$username" list.txt; then
echo "$username"
fi
done
将要签到的用户名保存在 list.txt 中,每行一个用户
答案2
grep
允许从文件中指定模式。因此,您可以使用grep -f
选项来实现此目的并-v
进行逆向模式匹配,即打印与模式不匹配的行。因此,
printf "^%s\n" 'John' 'Ben' > /tmp/list.txt
grep -v -f /tmp/list.txt /etc/passwd | cut -d ':' -f 1
rm l/tmp/ist.txt
我们还可以考虑大于 999 的 UID,因为默认情况下,它指的是人类用户,除非由系统管理员更改。
awk -F ':' '$1 !~ /John|Ben|nobody/ && $3 > 999' /etc/passwd