Bash 在cut命令中使用过滤器

Bash 在cut命令中使用过滤器,bash,grep,cut,Bash,Grep,Cut,您好,我收到了一个文件,它的格式是这样的 k2mff:x:32162:30:NJIT业余无线电俱乐部:/afs/cad/u/k/2/k2mff:/usr/local/etc/klub/clubshell 参议院:x:32164:30:NJIT学生参议院:/afs/cad/u/s/e/senate:/usr/local/etc/klub/clubshell ge:x:32184:30:Hongya ge:/afs/cad/u/g/e/ge:/bin/tcsh 斯帕索维奇:x:32186:30:la

您好,我收到了一个文件,它的格式是这样的

k2mff:x:32162:30:NJIT业余无线电俱乐部:/afs/cad/u/k/2/k2mff:/usr/local/etc/klub/clubshell
参议院:x:32164:30:NJIT学生参议院:/afs/cad/u/s/e/senate:/usr/local/etc/klub/clubshell
ge:x:32184:30:Hongya ge:/afs/cad/u/g/e/ge:/bin/tcsh
斯帕索维奇:x:32186:30:lazar斯帕索维奇fac/staff:/afs/cad/u/s/p/斯帕索维奇:/bin/csh
等等。
我正在使用grep命令获取粗体字段:

grep "csh" /etc/passwd | cut -d ":" -f 3,5,6
我的问题是,由于
cut
命令使用分隔符,字段6将返回

/afs/cad/u/s/p/spasovic

是否有一种方法我只能在
cut
命令中检索最后一个
/
后面的字符,特别是字段6?或者我必须将输出过滤到另一个命令吗?

您可以使用bash的功能在分隔符(
$IFS
)上拆分一行,以获得不同的字段和
${var##glob}
参数扩展来删除特定字段的部分

因此,您可以选择:

# read each line and split it into named variables
while IFS=: read -r name pw uid gid gecos home shell; do
    # check the part after `/' in $shell 
    if [[ "${shell##*/}" == csh ]]; then
        # print the fields you want
        echo "$uid" "$gecos" "${home##*/}"
    fi
done < /etc/passwd
#读取每行并将其拆分为命名变量
而IFS=:read-r name pw uid gid gecos home shell;做
#检查$shell中“/”后面的部分
如果[[“${shell##*/}”==csh]];然后
#打印所需的字段
回显“$uid”“$gecos”“${home##*/}”
fi
完成

您可以将其他if/then语句添加到此循环中,以根据其他条件打印其他字段,等等。

grep“csh”/etc/passwd | cut-d:“-f3,5,6 | sed的#/.*/./.#g”可能适合您,或者更好,
awk-f:'$7~/\/csh$/{print$3,5,gensub(“.*/”,“,”g“,”6)}/etc passwd。或者,除非您的用户的主目录与其用户名不同-
awk-F:'$7~/\/csh$/{print$3,$5,$1}'/etc/passwd