У меня длинный список IP-адресов, которые не в порядке. Мне нужно выяснить, сколько IP-адресов существует до / после определенного IP-адреса. Как мне этого добиться?
shell-script
text-processing
Мандар Шинде
источник
источник
Ответы:
Количество строк до и после матча, включая совпадение (т.е. вам нужно вычесть 1 из результата, если вы хотите исключить совпадение):
Но это не имеет ничего общего с IP-адресами, в частности.
источник
Может быть, самый простой,
Спасибо @JoshepR за указание на ошибку
источник
dc
.Я сделал это двумя способами, хотя я думаю, что мне это нравится больше всего:
Это сохраняет все эти переменные как текущие переменные оболочки и затем оценивает их в цикле for для вывода. Он подсчитывает общее количество строк в файле
wc
и получает номер первой совпавшей строки сsed
.Его вывод:
Я также сделал:
sed
печатает только совпадающие и последние номера строк, а затемtr
переводит промежуточные\n
строки виread
читает первыеsed
результаты в$ml
и все остальные в$ll
. Возможные множественные совпадения обрабатываются путем удаления всех значений, кроме последнего, из$ll
расширения при повторной установке позже.Его вывод:
Оба метода были проверены на файл, сгенерированный следующим образом:
По номеру строки:
"$IP"
затем\n
ewlinetr
- который переводит нули в\n
Ewlines, а затем в~/file
источник
Вот немного кода Perl, который делает это:
Это подсчитывает общее количество строк до и после строки, содержащей IP
192.168.1.1
. Замените на нужный вам IP.Используя только Bash:
источник
$.
вместо счетчика?$after
для$. - $before
.$. - 1
, сохраните$.
в$tmp
. Конец печати$. - $tmp
. Поэтому нам не нужен счетчик как до, так и после. Конечно, это менее читабельно, чем у вас.Я пробовал следующие команды, которые немного сложны, но дали бы точные результаты:
После:
Перед:
источник
awk
Решение количества строк отчетов до и после последнего матчаисточник
Grep
имеет функцию, которая может подсчитать, сколько раз найден определенный шаблон. Если вы используете-c
команду, которая сделает это. С помощью команды-c
and-v
это будет подсчитывать, сколько раз это не соответствует конкретному шаблонуПример:
grep -c -v <pattern> file
Так что если вы попробуете что-то вроде:
grep -c -v 192.168.x.x file.log
это должно работать.источник