У меня в журнале есть строки, похожие на:
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.
Итак, я попробовал следующую команду, чтобы получить количество каждого уникального IP-адреса, отсортированного:
grep ERR_AUTHORIZATION_REQUIRED file.log | awk '{print $6}' | cut -s -d ':' -f1 | tr -d '(' | sort | uniq -c
Однако вывод, который я получаю, похож на следующий:
3 10.10.10.10
2 10.10.10.11
3 10.10.10.15
Таким образом, это похоже на сортировку IP-адресов перед применением uniq -c
(что имеет смысл, учитывая команду), но если я поменяю местами команды uniq
и sort
, каждый IP-адрес будет выведен со значением 1
.
решение1
Из uniq
страницы руководства:
DESCRIPTION
Discard all but one of successive identical lines from INPUT (or standard input), writing to OUTPUT (or standard output).
Здесь критическое слово — «последовательный». Он не ищет дубликаты в любой точке потока, только те, которые идут сразу за ним. Сортировка заставляет все дубликаты располагаться рядом друг с другом, чтобы их можно было удалить (и посчитать).