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

Linux 如何从/etc/passwd格式化用户帐户的输出,linux,bash,Linux,Bash,我想格式化/etc/passwd中用户帐户的输出,以便仅显示名称、角色和目录路径,所有这些都用逗号分隔。我知道这应该很容易,但就我的一生而言,我不知道如何在某些冒号之间显示。(注意这应该适用于任何用户名,而不仅仅是ex) grep-joe/etc/passwd的exof joe:x:1001:1001:System Admin:/home/joe:/bin/bash 所需输出: joe, System Admin, /home/joe 谢谢大家! 试试看: grep joe /etc/pas

我想格式化
/etc/passwd
中用户帐户的输出,以便仅显示名称、角色和目录路径,所有这些都用逗号分隔。我知道这应该很容易,但就我的一生而言,我不知道如何在某些冒号之间显示。(注意这应该适用于任何用户名,而不仅仅是ex)

grep-joe/etc/passwd的exof

joe:x:1001:1001:System Admin:/home/joe:/bin/bash
所需输出

joe, System Admin, /home/joe
谢谢大家!

试试看:

grep joe /etc/passwd | cut -d: -f1,5,6
如果您确实需要“,”作为分隔符:

grep "^joe:" /etc/passwd | cut -d: -f1,5,6 | tr : ,
“^”确保只截取行开头与“joe”的匹配(感谢PSkocik的提醒)<默认情况下,code>grep
接受
regex

bash中的翻译,但有两行:

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

(但下次你应该再努力一点——你的问题很难回答:)

使用
cut
将逗号用作
——输出分隔符:

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

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

while IFS=: read user pw uid gid gecos home shell ; do 
    if [ "$user" = "joe" ] ; then 
        echo "$user, $gecos, $home" 
    fi 
done < /etc/passwd
而IFS=:读取用户pw uid gid gecos home shell;做
如果[“$user”=“joe”];然后
echo“$user$gecos$home”
fi
完成
添加到变体中,在bash本身中,您可以通过管道将
grep
的输出直接传输到括在
read
中的大括号中,并根据需要使用
IFS
分隔字段。使用字段的短名称,可以执行以下操作:

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

这将提供您所寻求的输出(如果
/etc/passwd
包含条目)

,效果非常好。如果你不介意我问的话,这是怎么回事?猜测这与在冒号之间剪切第1、第5和第6个内容有关?鉴于两个版本都会导致三个过程,我更喜欢纯POSIX版本。顺便说一句,您应该为
^joe:
,而不是
joe
@Eric单击
cut
命令逐行读取文件,在分隔符
-d
处剪切,并仅输出字段
-f
。当您使用piping-
|
-这是您必须熟悉的东西时,“文件”实际上是
stdin
,它是从上一个命令“piped”到的-
grep
-作为“文件”接收来自`grep的
stdout
。到tr的第二个管道以类似的方式在每行中翻译为“:”到“,。@kabanus:也应该在那里<代码>^joe
将匹配所有以
joe
开头的用户名(例如,joey或joeblow)@PSkocik你的书呆子,我喜欢。它必须是bash吗?一般来说,
awk
命令用于此类操作,但字符串操作必须更简单,例如在
ruby
中。您也可以从命令行运行
ruby
,如果您需要,我可以用ruby向您发送解决方案。稍有变化:
grep-joe/etc/passwd |而IFS=:read-r-u x uid gid n h s;做回显“$u,$n,$h”;完成
@DavidC.Rankin,我会选择
grep'^joe:'
只是为了一般的严格性同意,不需要锚定和终止。我喜欢你的回答。我接受了你的建议并更新了我的
:p
grep '^joe:' /etc/passwd | 
{ IFS=: read -r u x uid gid n h s; echo "$u, $n, $h"; }