У меня есть файл журнала, отсортированный по IP-адресам, я хочу узнать количество вхождений каждого уникального IP-адреса. Как я могу сделать это с Bash? Возможно перечисление количества вхождений рядом с ip, например:
5.135.134.16 count: 5
13.57.220.172: count 30
18.206.226 count:2
и так далее.
Вот образец журнала:
5.135.134.16 - - [23/Mar/2019:08:42:54 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
5.135.134.16 - - [23/Mar/2019:08:42:55 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
5.135.134.16 - - [23/Mar/2019:08:42:55 -0400] "POST /wp-login.php HTTP/1.1" 200 3836 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
5.135.134.16 - - [23/Mar/2019:08:42:55 -0400] "POST /wp-login.php HTTP/1.1" 200 3988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
5.135.134.16 - - [23/Mar/2019:08:42:56 -0400] "POST /xmlrpc.php HTTP/1.1" 200 413 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:05 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:06 -0400] "POST /wp-login.php HTTP/1.1" 200 3985 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:07 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:08 -0400] "POST /wp-login.php HTTP/1.1" 200 3833 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:09 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:11 -0400] "POST /wp-login.php HTTP/1.1" 200 3836 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:12 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:15 -0400] "POST /wp-login.php HTTP/1.1" 200 3837 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.220.172 - - [23/Mar/2019:11:01:17 -0400] "POST /xmlrpc.php HTTP/1.1" 200 413 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
13.57.233.99 - - [23/Mar/2019:04:17:45 -0400] "GET / HTTP/1.1" 200 25160 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
18.206.226.75 - - [23/Mar/2019:21:58:07 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "https://www.google.com/url?3a622303df89920683e4421b2cf28977" "Mozilla/5.0 (Windows NT 6.2; rv:33.0) Gecko/20100101 Firefox/33.0"
18.206.226.75 - - [23/Mar/2019:21:58:07 -0400] "POST /wp-login.php HTTP/1.1" 200 3988 "https://www.google.com/url?3a622303df89920683e4421b2cf28977" "Mozilla/5.0 (Windows NT 6.2; rv:33.0) Gecko/20100101 Firefox/33.0"
18.213.10.181 - - [23/Mar/2019:14:45:42 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
18.213.10.181 - - [23/Mar/2019:14:45:42 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
18.213.10.181 - - [23/Mar/2019:14:45:42 -0400] "GET /wp-login.php HTTP/1.1" 200 2988 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
command-line
bash
sort
uniq
j0h
источник
источник
sort -V
хотя я думаю, что это не требуется. Я отправил топ-10 злоумышленников на странице входа системному администратору с рекомендациями по запрету соответствующих подсетей. например, один IP-адрес попадал на страницу входа более 9000 раз. этот IP и его подсеть класса D теперь занесены в черный список. Я уверен, что мы могли бы автоматизировать это, хотя это другой вопрос.Ответы:
Вы можете использовать
grep
иuniq
для списка адресов, зациклить их иgrep
снова для подсчета:grep -o '^[^ ]*'
выводит каждый символ от начала (^
) до первого пробела в каждой строке,uniq
удаляет повторяющиеся строки, оставляя вам список IP-адресов. Благодаря подстановке командfor
цикл зацикливается на этом списке, печатая текущий обработанный IP-адрес, за которым следуют «число» и количество. Последний вычисляется какgrep -c
, который подсчитывает количество строк, по крайней мере, с одним соответствием.Пример запуска
источник
uniq -c
илиawk
только должны прочитать файл один раз,<log grep ...
нетgrep ... log
?Вы можете использовать
cut
иuniq
инструменты:Пояснение:
cut -d ' ' -f1
: извлечь первое поле (IP-адрес)uniq -c
: сообщать о повторных строках и отображать количество вхожденийисточник
sed
, например,sed -E 's/ *(\S*) *(\S*)/\2 count: \1/'
чтобы получить результат в точности так, как хотел OP.sort file | cut ....
если вы не уверены, что файл уже отсортирован.Если вам не требуется заданный формат вывода, я бы порекомендовал уже опубликованный
cut
+uniq
ответЕсли вам действительно нужен заданный формат вывода, однопроходным способом сделать это в Awk будет
Это несколько не идеально, когда входные данные уже отсортированы, так как они без необходимости сохраняют все IP-адреса в памяти - лучший, хотя и более сложный способ сделать это в предварительно отсортированном случае (более прямо эквивалентном
uniq -c
) будет:Ex.
источник
Вот одно из возможных решений:
file.log
на фактическое имя файла.$(awk '{print $1}' "$IN_FILE" | sort -u)
предоставит список уникальных значений первого столбца.grep -c
посчитает каждое из этих значений в файле.источник
printf
...Некоторые Perl:
Это та же идея, что и в awk-подходе Steeldriver , но в Perl. В
-a
причины Perl автоматически разделить каждую строку ввода в массив@F
, чей первый элемент (ИС)$F[0]
. Таким образом,$k{$F[0]}++
будет создан хеш%k
, ключи которого - это IP-адреса, а значения - количество раз, которое каждый IP-адрес был просмотрен. Это}{
в стиле фанк Perlspeak для «сделать все остальное в самом конце, после обработки всего ввода». Таким образом, в конце сценарий будет перебирать ключи хеша и печатать текущий ключ ($_
) вместе со значением ($k{$_}
).И просто чтобы люди не думали, что Perl заставляет вас писать сценарии, которые выглядят как загадочные писанины, это то же самое в менее сжатой форме:
источник
Может быть, это не то, чего хочет ОП; однако, если мы знаем, что длина IP-адреса будет ограничена 15 символами, более быстрый способ отобразить счетчики с уникальными IP-адресами из огромного файла журнала можно получить с помощью
uniq
одной команды:Параметры:
-w N
сравнивает не болееN
символов в строках-c
будет префикс строки по количеству вхожденийВ качестве альтернативы, для точного форматированного вывода я предпочитаю
awk
(должно работать и для адресов IPV6), ymmv.Обратите внимание, что
uniq
не будет обнаруживать повторяющиеся строки во входном файле, если они не являются смежными, поэтому это может быть необходимо дляsort
файла.источник
FWIW, Python 3:
Выход:
источник
Объяснение: Возьмите первое поле разбиения my.log на тире
-
и отсортируйте его.uniq
нужен отсортированный ввод.-c
говорит ему подсчитывать вхождения.источник