使用 grep 扫描 /etc/passwd

使用 grep 扫描 /etc/passwd

我正在尝试使用单个命令扫描 /etc/passwd 中的 gecos 字段,格式为“用户(用户 ID)是(真实姓名)”,因此输出将是“用户 brian 是 Brian”。我已经尝试了一个小时,但还是想不出一个好的解决方案。我确信我需要使用 grep,但想不出一个好的方法。

答案1

awk -F: '$1=="brian" {print "User", $1, "is", $8}' /etc/passwd

$1=="brian"如果您想打印文件中的每一行,请省略。

答案2

awk -F:'{print "用户 ", $1, "是 ", $5;}' /etc/passwd

使用 awk 似乎是更好的选择。

答案3

根据 Pascal 的评论,您需要使用 awk 之类的实用程序(或 Perl、Python、Ruby 等)。此 awk 命令适用于以逗号分隔的 GECOS 字段(以用户真实姓名开头)的 passwd 文件:

awk -F: '{split($5,a,","); print "User "$1" is "a[1]}' /etc/passwd

答案4

您的问题有点模糊,但到目前为止,所有答案都解决了将 passwd 行解析为您所用格式的问题。但是,您建议使用,这grep让我认为您还想挑选一个特定的条目,而不是为系统上的每个用户打印一行。

grep当然是一种可能性,但是我发现该getent命令是从 passwd 文件中获取条目的更简洁的方法。

由于有如此多的awk基于解决方案,我尝试使用 in 进行解析sed。这只是为了获得一组更加丰富多彩的答案,我不认为它对于任务来说更好或更简单。

#!/bin/bash
if [[ $# != 1 ]]; then
    echo "$0: wrong number of arguments"
    echo -n "Usage: "
    echo "$0 {username | UID}"
fi

getent passwd "$1" \
    | sed 's/\(.*\):.*:.*:.*:\(.*\):.*:.*$/User \1 is \2/'

扩展脚本以采用任意数量的参数留给读者练习。

相关内容