2017-04-24 80 views
0

如何從使用AWK的wtmp文件的開頭每天獲取登錄次數? 我想過使用關聯數組,但我不知道如何實現它在AWK ..使用Shell腳本和AWK在Linux上登錄的次數

myscript.sh

#!/bin/bash 

awk 'BEGIN{numberoflogins=0} 
#code goes here' 

last命令的輸出:

[[email protected] Documents]$ last 
fnorbert tty2   /dev/tty2  Mon Apr 24 13:25 still logged in 
reboot system boot 4.8.6-300.fc25.x Mon Apr 24 16:25 still running 
reboot system boot 4.8.6-300.fc25.x Mon Apr 24 13:42 still running 
fnorbert tty2   /dev/tty2  Fri Apr 21 16:14 - 21:56 (05:42) 
reboot system boot 4.8.6-300.fc25.x Fri Apr 21 19:13 - 21:56 (02:43) 
fnorbert tty2   /dev/tty2  Tue Apr 4 08:31 - 10:02 (01:30) 
reboot system boot 4.8.6-300.fc25.x Tue Apr 4 10:30 - 10:02 (00:-27) 
fnorbert tty2   /dev/tty2  Tue Apr 4 08:14 - 08:26 (00:11) 
reboot system boot 4.8.6-300.fc25.x Tue Apr 4 10:13 - 08:26 (-1:-47) 
wtmp begins Mon Mar 6 09:39:43 2017 

外殼腳本的輸出應爲:

Apr 4: 4 
Apr 21: 2 
Apr 24: 3 

,使用關聯數組,如果有可能

+2

爲了使這個問題自包含的,你應該張貼的更多信息:什麼是'wtmp'內容?它的位置的路徑是什麼? –

+1

你可以先給我們展示你的輸入文件 – Inian

+0

對不起,我說的不夠清楚。我的意思是來自** last **命令輸出的最後一行,其中說:「wtmp開始於2017年3月6日星期一09:39:43」。我不知道這個文件在哪裏可以找到,只是我聽說過它,我認爲這將是有益的,如果我提到它。 –

回答

1

在AWK,陣列可以由字符串或數字進行索引,所以可以使用它像一個關聯數組。

但是,你所要求的將很難做到awk可靠,因爲分隔符是空格,因此空字段會拋出列,並且如果你使用FIELDWIDTHS,你也會被列拋出長於他們分配的寬度。

如果你正在尋找的只是每天的登錄數,你可能想使用的sed和awk(和排序)的組合:

last | \ 
    sed -E 's/^.*(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([ 0-9]{2}).*$/\2 \3/p;d' | \ 
    awk '{arr[$0]++} END { for (a in arr) print a": " arr[a]}' | \ 
    sort -M 

sed -E使用擴展的正則表達式,並該模式僅打印由last發出的每行的日期(這匹配於星期幾,但僅打印月份和日期)

我們可以使用uniq -c來獲得計數,但是使用awk我們可以如你所暗示的那樣做一個關聯數組。

最後使用sort -M我們在簡短日期格式,如Apr 24Mar 16排序等

+0

謝謝,它的工作原理! :) –

0

請嘗試以下AWK腳本(假設月份是一樣的,指出了當前月):

myscript.awk:

#!/bin/awk -f 
{ 
    a[NR]=$0; # saving each line into an array indexed by line number 
} 
END { 
    for (i=NR-1;i>1;i--) { # iterating lines in reverse order(except the first/last line) 
     if (match(a[i],/[A-Z][a-z]{2} ([A-Z][a-z]{2}) *([0-9]{1,2}) [0-9]{2}:[0-9]{2}/, b)) 
      m=b[1];  # saving month name 
      c[b[2]]++; # accumulating the number of occurrences 
    } 
    for (i in c) print m,i": "c[i] 
} 

用法:

last | awk -f myscript.awk 

輸出:

Apr 4: 4 
Apr 21: 2 
Apr 24: 3