linux bash,打印包含列中字符串的行

时间:2013-05-22 17:27:55

标签: linux bash

假设我的文件/ 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”而不是整行

由于

6 个答案:

答案 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