我希望能够看到当前登录到服务器的用户,然后根据用户名搜索/etc/passwd
文件,找到他们的ID(第3列)和全名(第5列)并一起显示。< / p>
例如:
$ who
USER TTY
billyt pts/2
$ cat /etc/passwd
…
billyt:x:10:100:Tom Billy:/home/billyt:/bin/bash
…
我的输出应显示其用户名,ID和全名:
Username: billyt ID: 10 FullName: Tom Billy
这是我到目前为止所尝试的:
#!/bin/bash
file="/etc/passwd"
while IFS=: read -r f1 f2 f3 f4 f5 f6 f7
do
# display fields using f1, f2,..,f7
echo "Username: $f1, UserID: $f3, FullName: $f5"
done <"$file"
我尝试显示我需要的字段(f1,f3和f5)。这是一个好方法吗?我是否可以从who
命令进行搜索,将第一个who(用户名)字段保存到who.txt
,然后从上面的文件中搜索?
答案 0 :(得分:3)
您可以使用who
命令将用户存储在数组中,然后在读取/etc/passwd
文件时,循环访问数组以查看用户是否在数组中,如果是,则打印来自/etc/passwd
文件的条目,格式为您所需的格式。
类似的东西:
#!/bin/bash
while read -r user throw_away; do
users+=( "$user" )
done < <(who)
while IFS=: read -r f1 f2 f3 f4 f5 f6; do
for name in "${users[@]}"; do
if [[ "$name" == "$f1" ]]; then
echo "Username: $f1, UserID: $f3, FullName: $f5"
fi
done
done < /etc/passwd
我们使用process substitution <(..)
将who
的输出传递给第一个while loop
并创建一个数组users
。由于我们只需要名称,因此我们使用虚拟变量throwaway
来捕获其他所有内容。
在第二个while loop
中(我重新使用了大部分现有代码),我们检查`/ etc / passwd / file中的第一个字段是否存在于我们的数组中。如果是这样,我们将以您想要的格式打印该行。
您还可以使用关联数组(bash v4.0或更高版本)将用户存储为键。我会留给你练习。
答案 1 :(得分:1)
当然,有很多方法可以做到这一点。
echo "Username UserID Full Name"
while read name therest; do
g=$(grep "$name" /etc/passwd)
[[ "$g" =~ ([^:]+):[^:]+:([^:]+):[^:]+:([^:]+) ]]
printf "%-12s %6d %s\n" \
"${BASH_REMATCH[1]}" \
"${BASH_REMATCH[2]}" \
"${BASH_REMATCH[3]}"
done < <(who)