У меня есть файл в следующем формате:
$ cat file.txt
27.33.65.2
27.33.65.2
58.161.137.7
121.50.198.5
184.173.187.1
184.173.187.1
184.173.187.1
Каков наилучший способ проанализировать файл file.txt
в таком формате:
27.33.65.2: 2
58.161.137.7: 1
121.50.198.5: 1
184.173.187.1: 3
Другими словами, я хочу пройтись по файлу и посчитать, сколько раз каждый IP-адрес появляется. Я уже проверил это, sort
так что все IP-адреса в порядке и непосредственно друг за другом.
Ответы:
Ты ищешь
uniq -c
Если результат этого вам не нравится, его можно легко проанализировать и переформатировать.
Например:
источник
uniq
и,awk
кажется, неuniq
работает только с отсортированным вводом (он соответствует соседним совпадающим строкам, а не любым строкам из файла).sort
!uniq
кажется, действительно, более умное решение. Путь awk:источник
sort
в мой ответ все еще происходит быстрее, так как нужно сортировать меньше элементов. ;-)самый сильный файл сортировки, затем получить счетчик по unic -c
sort filename | uniq -c
источник
uniq -c
будет работать, но вывести результат в неправильном формате. Вот почему принятый ответ не использует,sort
а вместо этого переформатирует выводuniq -c
.Я бы использовал Python. На каждом Linux-ststem в настоящее время установлен python2.
Добавьте каждый IP-адрес в dict (ассоциативный массив) в виде пар ключ = значение, т. Е. {"12.34.56.78": 1, "87.76.43.21": 3}.
Вы 'проверяете' IP-адрес в качестве ключа и увеличиваете значение на 1. Если вы используете defaultdict ("ip"), если ключ не существует, он создается со значением по умолчанию, равным 0. Если ключ существует уже defaultdict ничего не делает. Значение увеличивается на следующей строке.
выходной файл:
Я знаю, что вы искали решение для командной строки, но, как вы видите, это элегантно отформатированный дисплей, который занимал всего около десятка строк или около того. Python - отличный инструмент для администрирования.
источник