我有一项任务要从/etc/passwd
文件中打印出有关用户的信息。我想要的是输出是列格式而不是行格式。
我设法做的是借助tr
命令将所有内容打印在新行上,所以现在的输出如下所示。
user
x
1002
1002
/home/user
/bin/sh
但是我想要的是这样的输出。
username user
password x
user id 1002
group id 1002
comment
directory /home/user
shell /bin/sh
我的代码现在看起来像这样
grep user /etc/passwd | tr ':' '\n'
答案 0 :(得分:1)
只需使用:
作为IFS的值来解析文件即可。
wanted=user
grep ":$wanted:" /etc/passwd | # this grep alone not a great idea
while IFS=: read usr pswd uid gid cmnt dir shell;
do [[ "$usr" == "$wanted" ]] || continue # skip false hits
printf 'username %s\npassword %s\nuser id %s\ngroup id %s\n%s\ndirectory %s\nshell %s\n' "$usr" "$pswd" "$uid" "$gid" "$cmnt" "$dir" "$shell";
done
仅grep会给您带来错误的点击。我的第一个测试给我username tss
的评论是Account used by the trousers package to sandbox the tcsd daemon
,给我username saslauth
的评论是Saslauthd user
。
在其周围添加冒号可防止在我的passwd文件中出现错误命中,但是可以肯定的是,每次迭代时都要明确检查用户。
答案 1 :(得分:0)
您可以使用以下shell脚本。我只是为两个字段编写的,例如username
和password
。希望您可以管理其他领域。
while read line
do
echo $line | awk -F':' '{print "Username: "$1"\nPassword: "$2"\n_______"}'
done</etc/passwd
[root@967dd7743677 test]# while read line; do echo $line | awk -F':' '{ print "Username: " $1 "\nPassword: " $2 "\n______" }'; done</etc/passwd
Username: root
Password: x
______
Username: bin
Password: x
______
Username: daemon
Password: x
______