2017-02-25 3 views
1

Ich möchte wissen, wie viele Benutzer google.com mit meinem Proxy mit den letzten 30 Minuten besucht haben.Einzigen Wert von awk Ausgang zählen

awk -v bt=$(date "+%s" -d "30 minutes ago") '($1 > bt) && $4~/google.com/ {printf("%s|%s|%s|%s\n", strftime("%F %T",$1), $2 , $3, $4)} ' access.log 

Die Protokolle sehen aus wie dieses

2017-02-19 12:09:44|[email protected]|200|https://google.com/ 
2017-02-19 12:10:23|[email protected]|200|https://google.com/ 

Jetzt kann ich einfach die Anzahl der Datensätze zählen

awk -v bt=$(date "+%s" -d "30 minutes ago") '($1 > bt) && $4~/google.com/ {printf("%s|%s|%s|%s\n", strftime("%F %T",$1), $2 , $3, $4)} ' access.log | wc -l 

Ausgang ist 2.

Wie kann ich den Befehl ändern, um nur Datensätze mit eindeutiger E-Mail anzeigen. Im obigen Fall sollte die Ausgabe 1 sein.

Antwort

1

verweisen Ergebnisliste

awk -v FS='|' -v bt="$(date +'%Y-%m-%d %H:%M:%S' -d '30 minutes ago')" ' 
    ($1 > bt) && $4~/google.com/ && !seen[$2]++ 
    ' access.log 

zählen zu bekommen

awk -v FS='|' -v bt="$(date +'%Y-%m-%d %H:%M:%S' -d '30 minutes ago')" ' 
    ($1 > bt) && $4~/google.com/ && !seen[$2]++{ count++ } 
    END{ print count+0 } 
    ' access.log 

für die Prüfung

# Current datetime of my system 
$ date +'%Y-%m-%d %H:%M:%S' 
2017-02-26 00:06:19 

# 30 minutes ago what was datetime 
$ date +'%Y-%m-%d %H:%M:%S' -d '30 minutes ago' 
2017-02-25 23:36:20 

# Input file, I modified datetime to check command 
$ cat f 
2017-02-25 23:10:44|[email protected]|200|https://google.com/ 
2017-02-25 23:45:23|[email protected]|200|https://google.com/ 
Ausgabe

- 1 zu sehen, führen

$ awk -v FS='|' -v bt="$(date +'%Y-%m-%d %H:%M:%S' -d '30 minutes ago')" ' 
    ($1 > bt) && $4~/google.com/ && !seen[$2]++ 
    ' f 
2017-02-25 23:45:23|[email protected]|200|https://google.com/ 

Ausgang - 2 zu sehen

$ awk -v FS='|' -v bt="$(date +'%Y-%m-%d %H:%M:%S' -d '30 minutes ago')" ' 
    ($1 > bt) && $4~/google.com/ && !seen[$2]++{ count++ } 
    END{ print count+0 } 
    ' f 
1 
0

Einfach Rohr die Protokolle zählen zu

sort -u -t "|" -k "2" 

So haben Sie so etwas wie :

awk -v bt=$(date "+%s" -d "30 minutes ago") '($1 > bt) && $4~/google.com/ {printf("%s|%s|%s|%s\n", strftime("%F %T",$1), $2 , $3, $4)} ' access.log | sort -u -t "|" -k "2" 
Verwandte Themen