为/ etc / passwd文件输出的每一行打印出名称

时间:2019-01-02 12:58:52

标签: linux bash scripting

我有一项任务要从/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'

2 个答案:

答案 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脚本。我只是为两个字段编写的,例如usernamepassword。希望您可以管理其他领域。

脚本

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
    ______