2

我希望能够查看当前登录服务器的人员,然后/etc/passwd根据他们的用户名搜索文件并找到他们的 ID(列 3)和全名(列 5)并将它们一起显示。

例如:

$ 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.txt然后从上面的文件中搜索它吗?

4

2 回答 2

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 

我们使用进程替换 <(..)将输出传递who给 firstwhile loop并创建一个数组users。由于我们只需要名称,因此我们使用虚拟变量throwaway来捕获其他所有内容。

在第二个中while loop(我重用了您现有的大部分代码),我们检查 `/etc/passwd/ 文件中的第一个字段是否存在于我们的数组中。如果是这样,我们会以您想要的格式打印该行。

您还可以使用关联数组(bash v4.0 或更高版本)将用户存储为键。我会把它留给你练习。

于 2014-05-03T23:33:17.303 回答
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)
于 2014-05-04T00:10:12.170 回答