2

假设我的文件 /etc/passwd 包含

ntp:x:38:40::/etc/ntp:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
haldaemon:x:38:68:HAL daemon:/:/sbin/nologin
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:38::/var/lib/gdm:/sbin/nologin
sshd:x:388:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:38:72::/:/sbin/nologin

我要做的是在第三列中打印包含“38”的行,这将打印以下内容:

ntp:x:38:40::/etc/ntp:/sbin/nologin haldaemon:x:38:68:HAL 守护进程:/:/sbin/nologin gdm:x:42:38::/var/lib/gdm :/sbin/nologin tcpdump:x:38:72::/:/sbin/nologin

我尝试了类似的东西

cat "/etc/passwd" | cut -d ":" -f3 | grep "38"

但它只显示“38”而不是整行

谢谢

4

6 回答 6

3

你可以测试一下:

awk -F: '$3~/38/' /etc/passwd

请注意,也将打印带有 338 或 838 的第三列。

于 2013-05-22T17:32:10.090 回答
2

您可以使用 wk:

awk -F: '$3==38{print}' file

一般来说,我建议你避免/etc/passwd直接解析。相反,您可以使用getent passwd来读取 passwd 数据库。

于 2013-05-22T17:30:19.770 回答
2

你可以使用 grep

grep ^.*:.*:38:  /etc/passwd

Tripleee 评论后的改进版本:

egrep ^[^:]*:[^:]*:38: /etc/passwd
于 2013-05-22T17:37:21.497 回答
1

你可以这样做:

cat /etc/passwd  | egrep "^[[:alnum:]]*:[[:alnum:]]*:38:.*"

使用字母数字字符类。

于 2013-05-22T17:37:19.047 回答
1

在纯 bash 中(awk 是要走的路!):

$ while read line; do array=(${line//:/ }); [ ${array[2]} -eq 38 ] && echo $line; done < input
ntp:x:38:40::/etc/ntp:/sbin/nologin
haldaemon:x:38:68:HAL daemon:/:/sbin/nologin
于 2013-05-22T17:38:55.630 回答
0

只剩sed下:)

sed -n '/^[^:]*:[^:]:*38:/p' /etc/passwd

于 2013-05-22T17:53:47.313 回答