2

我可以使以下行在 ksh 上工作

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

但我想让它在 UNIX sh 和 UNIX csh 上运行。(在 linux sh 中它运行良好,但 linux 不是 unix ......)

我知道这有一些限制,因为似乎每个 UNIX(*) 都有自己的语法变化。

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

  1. 我不能在磁盘上写,所以我不能保存脚本。
  2. 我如何在 CSH 中写这个?
4

4 回答 4

3

这个 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
于 2013-04-15T19:40:28.507 回答
3

这可能对您有用,应该符合 POSIX:

last | awk 'FNR==NR{split($0,f,/:/);a[f[1]];next}($1 in a)&&++b[$1]==1' /etc/passwd - |  sort
于 2013-04-15T19:49:48.003 回答
1

您实际上并不需要 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上拆分密码文件。

于 2013-04-15T20:26:08.990 回答
1

只需使用简单的命令:

lastlog
于 2020-11-23T20:59:24.073 回答