我需要使用 grep 从 /etc/passwd 查找列出的所有用户主目录

我需要使用 grep 从 /etc/passwd 查找列出的所有用户主目录

我有一个与该网站上的另一个问题类似的问题,该人必须从 /etc/passwd 中使用 grep 或 awk 找到所有用户的列表。这对我有用,但我尝试翻译它以查找并列出它们的主目录。我已经知道你不能用一行来完成它,所以我知道我会使用管道。我已经在网上完成了研究,但我无法弄清楚问题所在。如果我使用 grep 并执行如下操作:

   grep -oE '^[/*/]$' /etc/passwd 

...它可能会给我一个错误,或者它还会向我显示 /bin/bash 文件,这不是我想要的。我只需要使用 grep 列出的用户名及其主目录!我也不确定 * 是否会将其他正斜杠显示为字符,因为某些主目录不仅仅有两个 /(正斜杠)。

答案1

您可以使用cut使用特定分隔符上的列分割文件:

cut -d: -f6 /etc/passwd

或者-f1,6对于第 1 列和第 6 列(字段)。

答案2

Grep 实际上不是以这种方式解析数据的工具; grep 更多的是用于模式匹配,并且您正在尝试进行文本处理。你会想使用 awk。

awk -F":" '$7 == "/bin/false" {print "User: "$1 "Home Dir: "$6}' /etc/passwd
  • awk- 命令

  • -F":"– 将数据分隔符设置为:

  • $7 == "/bin/false"– 检查第 7 个数据列是否为/bin/false

  • {print "User: "$1 "Home Dir: "$6}'– 表示以指定格式打印第一列和第六列。

  • /etc/passwd– 是我们正在处理的文件

答案3

正如其他人指出的那样,grep这不是最好的工具。如果您坚持使用它,并且您grep支持-o(仅打印行的匹配部分)和-P(使用 Perl 兼容正则表达式),您可以这样做:

$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/password
terdon
/home/terdon
bob
/home/bob

请注意,这将打印所有用户,包括系统用户。我只显示 4 行作为示例。

这将打印所有用户的用户名和主目录,但在不同的行上。然后,您需要连接每对线以将它们组合在一起:

$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/passwd | perl -pe 's/\n/ : / if $.%2'
root : /root
bin : /bin
daemon : /
mail : /var/spool/mail
ftp : /srv/ftp
http : /srv/http
uuidd : /
dbus : /
nobody : /
systemd-journal-gateway : /
systemd-timesync : /
systemd-network : /
systemd-bus-proxy : /
systemd-resolve : /
systemd-journal-upload : /
systemd-coredump : /
systemd-journal-remote : /
terdon : /home/terdon
avahi : /
polkitd : /
colord : /var/lib/colord
rtkit : /proc
gdm : /var/lib/gdm
git : /
bob : /home/bob

解释

正则表达式有两个部分,它查找^[^:]+OR (这就是意思|.*:\K[^:]+(?=:[^:]+)。第一个:从行的开头查找一个或多个非字符。这与用户名匹配。第二部分查找尽可能多的字符,直到:( .*:),然后丢弃它们(这就是它\K所做的),因此它们不会被打印。然后它匹配一个字符串 non- :,后面跟着:and non- :。这(?=foo)构造称为积极的前瞻并且是一种匹配字符的方式不包含匹配本身中的这些字符的模式。

如果当前行号 ( ) 能被 2 整除,则该perl命令将用 和 空格替换换行符。因此,每隔一行。:$.

答案4

我相信您可以通过“cut”来做到这一点,仅使用一个二进制文件,避免管道,达到与其他答案相同的结果,但以一种更优雅的方式:),如下所示:

$ cut -d : -f 1,6 /etc/passwd

root:/root
daemon:/usr/sbin
bin:/bin
sys:/dev
sync:/bin
games:/usr/games
man:/var/cache/man
lp:/var/spool/lpd
mail:/var/mail
news:/var/spool/news
....

如果你想要一个更好的格式+字母顺序的输出,这里是,但权衡是,你必须使用更多的二进制文件:

$ cut -d : -f 1,6 /etc/passwd | sort | column

avahi-autoipd:/var/lib/avahi-autoipd        man:/var/cache/man
avahi:/var/run/avahi-daemon                 messagebus:/var/run/dbus
backup:/var/backups                         news:/var/spool/news
bin:/bin                                    nobody:/nonexistent
clickpkg:/nonexistent                       ntp:/home/ntp
colord:/var/lib/colord                      proxy:/bin
daemon:/usr/sbin                            pulse:/var/run/pulse
dnsmasq:/var/lib/misc                       root:/root
games:/usr/games                            rtkit:/proc
gnats:/var/lib/gnats                        saned:/home/saned
hplip:/var/run/hplip                        speech-dispatcher:/var/run/speech-dispatcher
irc:/var/run/ircd                           sync:/bin
ivanleon:/home/ivanleon                     sys:/dev
kernoops:/                                  syslog:/home/syslog
libuuid:/var/lib/libuuid                    usbmux:/home/usbmux
lightdm:/var/lib/lightdm                    usermetrics:/var/lib/usermetrics
list:/var/list                              uucp:/var/spool/uucp
lp:/var/spool/lpd                           whoopsie:/nonexistent
lxc-dnsmasq:/var/lib/lxc                    www-data:/var/www
mail:/var/mail

相关内容