Ich habe Zeilen in einem Protokoll ähnlich den folgenden:
2015/11/02-07:55:39.735 INFO failed with ERR_AUTHORIZATION_REQUIRED. (10.10.10.11:61618) is not a trusted source.
2015/11/02-07:55:40.515 INFO failed with ERR_AUTHORIZATION_REQUIRED. (10.10.10.11:51836) is not a trusted source.
2015/11/02-07:55:39.735 INFO failed with ERR_AUTHORIZATION_REQUIRED. (10.10.10.10:61615) is not a trusted source.
2015/11/02-07:55:40.515 INFO failed with ERR_AUTHORIZATION_REQUIRED. (10.10.10.10:51876) is not a trusted source.
2015/11/02-07:55:39.735 INFO failed with ERR_AUTHORIZATION_REQUIRED. (10.10.10.10:61614) is not a trusted source.
2015/11/02-07:55:39.735 INFO failed with ERR_AUTHORIZATION_REQUIRED. (10.10.10.15:61614) is not a trusted source.
2015/11/02-07:55:39.735 INFO failed with ERR_AUTHORIZATION_REQUIRED. (10.10.10.15:61618) is not a trusted source.
2015/11/02-07:55:39.735 INFO failed with ERR_AUTHORIZATION_REQUIRED. (10.10.10.15:61613) is not a trusted source.
Daher habe ich den folgenden Befehl ausprobiert, um die Anzahl aller eindeutigen IPs sortiert abzurufen:
grep ERR_AUTHORIZATION_REQUIRED file.log | awk '{print $6}' | cut -s -d ':' -f1 | tr -d '(' | sort | uniq -c
Die Ausgabe, die ich erhalte, ähnelt jedoch der folgenden:
3 10.10.10.10
2 10.10.10.11
3 10.10.10.15
Es ist also so, als würde die IP vor dem Anwenden sortiert uniq -c
(was angesichts des Befehls Sinn ergibt), aber wenn ich die Befehle uniq
und vertausche sort
, wird jede IP mit einer Anzahl von gedruckt 1
.
Antwort1
Aus der uniq
Manpage:
DESCRIPTION
Discard all but one of successive identical lines from INPUT (or standard input), writing to OUTPUT (or standard output).
Das entscheidende Wort hier ist „aufeinanderfolgend“. Es wird an keiner Stelle im Stream nach Duplikaten gesucht, sondern nur nach denen, die unmittelbar folgen. Beim Sortieren werden alle Duplikate nebeneinander angeordnet, damit sie entfernt (und gezählt) werden können.