我可以使以下行在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(*)都有自己的语法变体。
更新:对不起,这里有一些限制:
- 我无法在磁盘上写入,因此无法保存脚本。
- 我如何在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