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