Nota: eu tive que colocar isso junto em um sistema BSD que pode ter um formato de saída last
diferente do seu. A saída de last
no meu sistema é assim:
guido ttys000 Wed Apr 6 18:44 - 18:44 (00:00)
guido ttys000 Wed Apr 6 14:36 - 14:55 (00:18)
guido ttys000 Wed Apr 6 13:56 - 14:33 (00:37)
...
Portanto, você provavelmente precisará alterar alguns dos especificadores de campo no código awk
abaixo para corresponder à saída de last -a
em seu sistema.
Dito isso, aqui está minha abordagem, que conta com awk
apenas para fazer o trabalho:
#!/bin/bash
last | awk '
# Skip final 2 lines of output
# (empty line followed by "wtmp begins..."
/^$/ { exit }
# Increment connections per user
# Increment connections per user+ip combination
{
# Possibly need to change $1 and $2 to other field numbers
# depending on output of your "last"
user[$1] ++;
userip[$1,$2] ++;
}
# For each user, print total and scan user+ip array
# for user+ip totals accumulated for this user
END {
for (u in user) {
print u " : " user[u];
for (idx in userip) {
split(idx, arr, SUBSEP);
if (arr[1] == u) print "\t" arr[2] " - " userip[idx];
}
}
}
'
Exemplo de saída:
root : 7
console - 7
guido : 682
console - 69
ttys000 - 446
...