仅 Grep 来自 /etc/passwd 的 gids

仅 Grep 来自 /etc/passwd 的 gids

我只想将grep来自 的组 ID 包含在内/etc/passwd。现在我只想出了如何 grep 名称:

grep -oE '^[^:]+' /etc/passwd

这给了我:

[frynio@manjaro ~]$ grep -oE '^[^:]+' /etc/passwd
root
nobody
dbus
bin
daemon
mail
ftp
http
systemd-journal-remote
systemd-coredump
uuidd
dnsmasq
rpc
usbmux
avahi
colord
cups
deluge
git
lightdm
nm-openconnect
nm-openvpn
ntp
polkitd
frynio

如何更改此正则表达式,省略前三个:,然后开始匹配[^:]+? (因为^它匹配行的开头,这就是为什么我可以提取名称,并且我想要一些东西来匹配 3 个冒号之后的位置)。

PS一使用grep

答案1

请注意,这是不可能的与标准一样grepgrep总是返回与给定模式匹配的整行。 GNU 是可能的grep,但它无法移植到许多其他类型的 Unices,难以维护(或修改以做更有趣的事情),并且难以理解。

更容易使用awk

getent passwd | awk -F ':' '{ print $4 }'

这将获取passwd数据并提取第四个:分隔字段。

或者,使用更简单cut

getent passwd | cut -d ':' -f 4

尽管使用它awk您可以进行更有趣的处理,例如仅获取小于 1000 的 UID 的 GID:

getent passwd | awk -F ':' '$3 < 1000 { print $4 }'

:人们还可以选择从 的输出中解析出第三个-delimited 列getent group,这将具有不提供重复项的额外好处。

getent group | cut -d ':' -f 3

答案2

如果您使用 GNU grep (这是 Linux 上的默认命令),您可以使用选项-P和前瞻断言来完成此操作:

grep -Po '[0-9]+(?=(?::[^:]*){3}$)' /etc/passwd

答案3

是否允许使用两个grep进程?如果是,请尝试:

grep -oE '^([^:]+:){3}[^:]+' /etc/passwd | grep -oE '[^:]+$'

答案4

是否允许使用pcregrep而不是常规的grep?如果是这样,你可以这样做

pcregrep -o2 '^([^:]+:){3}([^:]+)' /etc/passwd

pcregrep扩展选项的功能-o,使其匹配分组子字符串。在上述命令的正则表达式中, [^:]+:匹配passwd文件字段,因此^([^:]+:){3}匹配前三个字段(用户名、密码字段和 UID)。以下([^:]+)是正则表达式中的第二组,匹配第四个字段,即 GID。该-o2标志指示pcregrep仅输出第二组。

相关内容