2016-03-21 19 views
0

Kabuk programlamasında yeniyim.Kabuk betiği günlük oturum açma sayısını saymak için

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

kullanıyorum bunu yapmak için denedim: Ben

Çıktı aşağıdaki gibi görünmelidir bazı makinede kullanıcılar için haftanın günleri başına girişlerinde sayısını saymak için bir kabuk senaryo yazmaya çalışıyorum komutları en son, uniq ve sort gibi bu

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

ama sanırım bir şey kaçırıyorum çünkü yinelenen sonuçlar alıyorsunuz. Ayrıca, genel sayıların gün sayısına göre nasıl ayrılacağından emin değilim.

cevap

1

uniq ile ilgili sorun, yalnızca bitişik yinelenen satırları daraltmasıdır. Uniq üzerindeki -d örneğinde, yinelenen satırları kesen satırlar gizleniyor, güne giriş denemeleri arasında reboot 4.4.5-1-ARCH Wed Mar benzeri bazı satırların olduğunu tahmin ediyorum. Ayrıca, diğer kullanıcılar için sayımların ayrılmasında oturum açan birden çok kullanıcıyla ilgili sorunlarınız olacaktır.

Genellikle uniq satırlarının gerçek bir listesini almak için sort | uniq, ancak -d'yi kaldırırsanız, istemediğiniz satırlarla sonlanırsınız. Bunlar en iyi şekilde sort | uniq'dan önce veya sonra filtrelenir.

Son olarak, iki satır tam olarak eşleşmesi durumunda, son sort -u verileri silecektir, bunun ne istediğinizi düşünmüyorum. Bunun yerine, sayıları sıralamanız gerekiyorsa tarih sütununun (ayın rollover'ında küçük bir soruna neden olacak şekilde) ya da -k FILENUM argümanında önem verdiğiniz başka bir sütunla sıralamak daha iyidir.

birlikte birleştirin ve elde edersiniz: .../reboot/ {next};... nedenleri / s içinde kalıpla eşleşen satırları görmezden awk o

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

Not.