我只想将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
请注意,这是不可能的与标准一样grep
,grep
总是返回与给定模式匹配的整行。 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
仅输出第二组。