假设我的文件/ 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”而不是整行
由于
答案 0 :(得分:3)
你可以测试一下:
awk -F: '$3~/38/' /etc/passwd
请注意,也将打印带有338或838的第3列。
答案 1 :(得分:2)
你可以使用wk:
awk -F: '$3==38{print}' file
一般情况下,我建议您不要直接解析/etc/passwd
。相反,您可以使用getent passwd
来读取passwd数据库。
答案 2 :(得分:2)
你可以使用grep
grep ^.*:.*:38: /etc/passwd
在tripleee评论后改进版本:
egrep ^[^:]*:[^:]*:38: /etc/passwd
答案 3 :(得分:1)
你可以这样做:
cat /etc/passwd | egrep "^[[:alnum:]]*:[[:alnum:]]*:38:.*"
使用字母数字字符类。
答案 4 :(得分: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
答案 5 :(得分:0)
仅剩sed
:)
sed -n '/^[^:]*:[^:]:*38:/p' /etc/passwd