如何格式化/ etc / passwd中用户帐户的输出

时间:2017-06-24 20:22:29

标签: linux bash

我想格式化来自baz的用户帐户的输出,以仅显示名称,角色和目录路径,所有这些都以逗号分隔。我知道这应该很简单,但对于我的生活,我无法弄清楚如何在某些冒号之间展示。 (注意这应该适用于任何用户名,而不仅仅是ex)

Ex /etc/passwd

grep joe /etc/passwd

期望输出

joe:x:1001:1001:System Admin:/home/joe:/bin/bash

谢谢!

5 个答案:

答案 0 :(得分:5)

awk 'BEGIN{ FS=":"; OFS=", " } $1=="joe" { print $1,$5,$6; exit }' /etc/passwd 

(但是下次你应该多付出一些努力 - 你的问题非常不容易讨论:))

答案 1 :(得分:4)

cut使用逗号作为--output-delimiter

cut -d: -f1,5,6 --output-delimiter=, /etc/passwd

答案 2 :(得分:2)

尝试:

grep joe /etc/passwd | cut -d: -f1,5,6

如果真的需要“,”作为分隔符:

grep "^joe:" /etc/passwd | cut -d: -f1,5,6 | tr : ,

“^”确保仅截取该行开头的“joe”匹配(感谢PSkocik提醒)。默认情况下,grep会接受regex

bash中的翻译,但有两行:

x=`grep joe /etc/passwd | cut -d: -f1,5,6`
echo ${x/:/,}

答案 3 :(得分:0)

如果你想纯粹在shell中做(POSIX sh就足够了,不需要Bash),那么read就是你的朋友:

while IFS=: read user pw uid gid gecos home shell ; do 
    if [ "$user" = "joe" ] ; then 
        echo "$user, $gecos, $home" 
    fi 
done < /etc/passwd

答案 4 :(得分:0)

添加变体,在bash中,您可以将grep的输出直接传递到括号read的括号中,并根据需要使用IFS分隔字段。使用字段的短名称,您可以:

grep '^joe:' /etc/passwd | 
{ IFS=: read -r u x uid gid n h s; echo "$u, $n, $h"; }

哪个会给你寻求的输出(如果/etc/passwd包含条目)