2016-03-21 155 views
0

我是Shell編程的新手。我試圖寫一個shell腳本來算一些機器Shell腳本來計算每天登錄次數

輸出應該是這樣對登錄的每星期幾的用戶數:

123 Mon 
231 Tue 
555 Wed 
21 Thu 
44 Fri 
123 Sat 
10 Sun 

我試着用做命令最後,uniq的和排序這樣

last -s -7days | awk '{print $1, $4,$5,$6}' | uniq -cd |sort -u 

,但我覺得我失去了一些東西,因爲我莫名其妙地得到重複的結果。此外,我不知道如何獲得以天分隔的整體計數。

回答

1

uniq的問題是它只會摺疊相鄰的重複行。在你的情況下,在uniq上的-d隱藏了分解重複行的行,我猜你在一天的登錄嘗試之間有一些類似於reboot 4.4.5-1-ARCH Wed Mar的行。您也會遇到多個用戶登錄分解其他用戶的計數問題。

通常你會得到一個真正的uniq行列表,但是如果你刪除了-d,那麼你最終會得到你不想要的行。這些最好在sort | uniq之前或之後單獨過濾掉。

最後最後的sort -u會刪除數據,如果兩行碰巧完全匹配,我不認爲這是你想要的。相反,如果您需要對計數進行排序,則最好在日期列上進行排序(會導致月份滾動過程中出現小問題),或者使用另一個列關注-k FILENUM參數。

相結合這一點,你會得到:

last -s -7days | awk '/reboot/ {next}; /wtmp/ {next}; /^$/ {next}; {print $1, $4,$5,$6}' | sort | uniq -c | sort -k 5 

注意.../reboot/ {next};...使awk忽略匹配/秒鐘內的圖案線條。