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"; }