使用 grep 和 cut 过滤文本文件以仅显示以“m”、“w”或“s”开头的用户名及其主目录

Use grep and cut to filter text file to only display usernames that start with ‘m’ ‘w’ or ‘s’ and their home directories

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
sys:x:3:1:sys:/dev:/usr/sbin/nologin
games:x:5:2:games:/usr/games:/usr/sbin/nologin
mail:x:8:5:mail:/var/mail:/usr/sbin/nologin
www-data:x:33:3:www-data:/var/www:/usr/sbin/nologin
backup:x:34:2:backup:/var/backups:/usr/sbin/nologin
nobody:x:65534:1337:nobody:/nonexistent:/usr/sbin/nologin
syslog:x:101:1000::/home/syslog:/bin/false
whoopsie:x:109:99::/nonexistent:/bin/false
user:x:1000:1000:edco8700,,,,:/home/user:/bin/bash
sshd:x:116:1337::/var/run/sshd:/usr/sbin/nologin
ntp:x:117:99::/home/ntp:/bin/false
mysql:x:118:999:MySQL Server,,,:/nonexistent:/bin/false
vboxadd:x:999:1::/var/run/vboxadd:/bin/false

这是一个 /etc/passwd 文件,我需要对其执行此命令。到目前为止我有:

cut -d: -f1,6 testPasswd.txt | grep ???

这将显示所有用户名和关联的文件夹,但我无法解决如何仅查找以 m、w、s 开头的用户名和打印整行的问题。

我试过 grep -o '^[mws]*' 和它的不同变体,但 none 奏效了。

有什么建议吗?

使用 awk 更容易:

awk 'BEGIN{FS=OFS=":"}  ~ /^[mws]/{print , }' testPasswd.txt

sys:/dev
mail:/var/mail
www-data:/var/www
syslog:/home/syslog
whoopsie:/nonexistent
sshd:/var/run/sshd
mysql:/nonexistent

尝试

的变体
cut -d: -f1,6 testPasswd.txt | grep '^m\|^w\|^s' 

或者更简洁地说,

cut -d: -f1,6 testPasswd.txt | grep '^[mws]'

这更简洁,尤其是当您有很多模式要匹配时。

当然,如果没有约束,awk 解决方案会更好。