BASH搜索和打印用户,uid,上次登录

时间:2015-03-31 04:19:48

标签: bash awk uid passwd

凭借我生锈的bash技能,我试图做到以下几点:

  1. 查找拥有UID>的所有用户500
  2. 打印用户列表,包括用户名,评论,shell等
  3. 将上次登录日期附加到其中每个用户
  4. 到目前为止,我有这个:

    [user1@test2 ~]$ sudo awk -F: '{if ($3 > 500) {system("lastlog -u" $1)} }' /etc/passwd | grep -iv username
    
        oracle                                     **Never logged in**
        user1      pts/0    hostname Tue Mar 31 16:18:42 +1300 2015
        user2                                    **Never logged in**
    

    和此:

    [user1@test2 ~]$ sudo awk -F: '{if ($3 > 500) {print $1 "," $3 "," $5}}' /etc/passwd
    
    nfsnobody,65534,Anonymous NFS User
    oracle,54321,
    user1,54324,Test user1
    

    我希望像这样在一行中获取所有内容:

    oracle,54321,,**Never logged in**
    user1,54324,Test user1,pts/0    hostname Tue Mar 31 16:18:42 +1300 2015
    

    不确定如何连接两者,并用逗号替换空格。

    有人可以提供建议吗?谢谢!

2 个答案:

答案 0 :(得分:1)

试试这个:

awk -F':' '$3 > 500 {("lastlog -u" $1 | getline a); print $1,$3,$5,a}' OFS=',' /etc/passwd 

说明:

  • $3 > 500确保UID(第3列)大于500
  • ("lastlog -u" $1 | getline a)将输出保存到变量" a"。此输出应该等同于您的system("lastlog -u" $1) - 我实际上没有这个功能,但我会认为这是有效的
  • print $1,$3,$5,a将打印您想要的任何列(此处我有第1,3,5栏,以及之前保存的" lastlog"输出)
  • OFS=','将使用输出字段分隔符作为逗号

答案 1 :(得分:1)

这里不需要awk; bash可以完成内置所需的一切。 (对于此处的示例,请确保您的脚本以#!/bin/bash开头,而不是#!/bin/sh,或者使用bash scriptname而不是sh scriptname调用它们。

while IFS=: read -r username _ uid gid name homedir shell; do
  ((uid >= 500)) || continue
  { read; read; } < <(lastlog -u "$username")
  if [[ $REPLY = *"Never logged in"* ]]; then
    port=; from=; latest=
  else
    read _ port from latest <<<"$REPLY"
  fi
  echo "$username,$uid,$name,$homedir,$shell,$port,$from,$latest"
done < <(getent passwd)

顺便说一句,说join&#34;不起作用&#34;肯定是错误的 - 加入一个lastlog调用的输出比每个用户调用一次lastlog要高效得多,并且可以这样做:

join -t, \
    <(getent passwd | tr : , | sort -t, -k1,1) \
    <(lastlog | sed -r -e 's/[*][*]Never logged in[*][*]//' \
                       -e 's@[[:space:]]+@,@g' | tail -n +2 | sort -t, -k1,1) \
  | awk -F, '$3 >= 500'