Script de bash para resumir “last -a”

2

Eu gostaria de criar um script de shell de tal forma que ele execute o comando "last -a" e resuma seus dados no formulário:

userID : number of login sessions
            Host or ip1 - number of connections
            Host or ip2 - number of connections 

Estou tentando fazer isso com "grep" e "awk", mas ainda não consigo obter a saída desejada: (

Editar: meu progresso Para contar as instâncias do usuário e suas sessões:

 lasta=$(last -a)
 p1=$(echo "$lasta" | awk '{print $1}' | awk '{count[$1]++}END{for(j in count) print j,": "count[j]}')      
 echo "$p1"

Isso provavelmente está incorreto (contando instâncias de ID de host ou ip)

uniqueusers=$(echo "$lasta"| awk '{print $1}'| sort | uniq)
p2=$(echo "$lasta" | grep "$uniqueusers" | awk '{print $10 } ' | awk '{count[$1]++}END{for(j in count) print j,": "count[j]}')
echo "$p2"
    
por DynamicQ 06.04.2016 / 18:12

1 resposta

2

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
...
    
por 06.04.2016 / 20:10