如何在一行中获取不同shell的所有用户的最后登录时间



我可以使以下行在ksh

上工作
for user in $( awk -F: '{ print $1}' /etc/passwd); do last $user | head -1 ; done | tr -s "n" |sort

但是我想让它在UNIX sh和UNIX csh上工作。

我知道这样做是有局限性的,因为似乎每个UNIX(*)都有自己的语法变体。

更新:对不起,这里有一些限制:

  1. 我无法在磁盘上写入,因此无法保存脚本。
  2. 我如何在CSH中写这个?

这个awk-script似乎相当于上面的循环:

{
  cmd = "last "$1
  cmd | getline result
  printf "%s",  result
}

像这样使用:

awk -F: -f script_above.awk /etc/passwd

输出到sort

作为一行代码:

$ awk -F: '{cmd = "last "$1; cmd | getline result;printf "%s", result}' /etc/passwd

这可能对你有用,应该是POSIX兼容的:

last | awk 'FNR==NR{split($0,f,/:/);a[f[1]];next}($1 in a)&&++b[$1]==1' /etc/passwd - |  sort

您实际上并不需要Awk。

while IFS=: read user _; do
    last "$user" | head -n 1
done </etc/passwd  # | grep .

与其在Csh中重新定义它,不如使用

sh -c 'while IFS=: read user _; do last "$user" | head -n 1; done </etc/passwd'

对于自wtmp轮换以来未登录的用户,您将得到空输出;也许可以添加一个| grep .来清除这些。(我在上面加了注释)

重申一下,IFS=:将shell的内部字段分隔符设置为冒号,以便read将在此基础上分割密码文件。

使用简单的命令:

lastlog

最新更新