Bash 스크립트 요약 "last -a"

Bash 스크립트 요약 "last -a"

"last -a" 명령을 실행하고 해당 데이터를 다음 형식으로 요약하는 쉘 스크립트를 만들고 싶습니다.

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

이 작업을 수행하기 위해 "grep" 및 "awk"를 사용하려고 하지만 여전히 원하는 출력을 얻을 수 없습니다.

편집: 내 진행 상황은 사용자 인스턴스와 해당 세션을 계산하는 것입니다.

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

이는 정확하지 않을 수 있습니다(IP 또는 호스트 ID 인스턴스 계산).

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"

답변1

노트:나는 이것을 BSD 시스템에 넣어야 합니다. BSD 시스템은 last귀하의 시스템과 다른 출력 형식을 가질 수 있습니다. 내 시스템의 출력은 last다음과 같습니다.

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)
...

awk따라서 시스템의 출력 과 일치하도록 아래 코드의 일부 필드 지정자를 변경해야 할 수도 있습니다 .last -a

그렇게 말하면 awk제가 작업을 완료하기 위해 의지하는 것은 다음과 같습니다.

#!/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];
            }
        }
    }
'

출력 예:

root : 7
    console - 7
guido : 682
    console - 69
    ttys000 - 446
...

관련 정보