С sedвами можно сделать раздвижное окно.
sed '1N;$!N;/141.299.99.1/P;D'
Это делает это. Но будьте осторожны - bashбезумное поведение расширяется, ! даже когда цитируется !!! в командной строке из вашей истории команд может сделать его немного сумасшедшим. Добавьте к команде префикс, set +H;если вы обнаружите, что это так. Чтобы затем включить его (но почему ???) сделать set -Hпотом.
Это, конечно, будет применяться только тогда , когда вы были с помощью bash- хотя я не верю , что ты. Я вполне уверен, что вы работаете с csh- (это, случается, оболочка, чье безумное поведение bashподражает расширению истории, но, возможно, не до крайностей, которые приняла оболочка c) . Так , вероятно\! , должен работать. Я надеюсь.
Это весь переносимый код: POSIX описывает свои три оператора следующим образом: (хотя стоит отметить, что я только подтвердил, что это описание существовало еще в 2001 году)
[2addr]N
Добавьте следующую строку ввода, за \nисключением завершающей ewline, к пространству шаблона, используя встроенную \newline, чтобы отделить добавленный материал от исходного материала. Обратите внимание, что текущий номер строки изменяется.
[2addr]P
Записать пространство шаблона до первой \nстроки в стандартный вывод.
[2addr]D
Удалите начальный сегмент пространства образца через первую \nлинию ewline и начните следующий цикл.
Итак, в первой строке вы добавляете дополнительную строку в пространство шаблонов, чтобы она выглядела так:
^line 1s contents\nline 2s contents$
Затем в первой строке и в каждой последующей строке, за исключением самой последней, вы добавляете еще одну строку в пространство шаблона. Так это выглядит так:
^line 1\nline 2\nline 3$
Если ваш ip-адрес найден внутри вас, Pнаберите до первой новой строки, поэтому просто введите строку 1 здесь. В конце каждого цикла вы Dвыбираете одно и то же и начинаете заново с того, что осталось. Итак, следующий цикл выглядит так:
^line 2\nline 3\nline 4$
...и так далее. Если ваш ip будет найден на любом из этих трех, самый старый распечатает - каждый раз. Так ты всегда впереди всего на три строчки.
Вот быстрый пример. Я получу трехстрочный буфер для каждого числа, оканчивающегося на ноль:
seq 10 52 | sed '1N;$!N;/0\(\n\|$\)/P;D'
10
18
19
20
28
29
30
38
39
40
48
49
50
Это немного сложнее, чем ваш случай, потому что я должен был чередовать либо 0\n новой строки или 0$конца шаблонного пространства, чтобы более близко походить на вашу проблему - но они немного отличаются тем, что для этого требуется привязка - что может быть немного сложным, поскольку шаблон-пространство постоянно смещается.
Я использовал нечетные случаи 10 и 52, чтобы показать, что, пока якорь является гибким, то и вывод тоже. Полностью переносимый, я могу достичь тех же результатов, вместо этого рассчитывая на алгоритм и делаю:
seq 10 52 | sed '1N;$!N;/[90]\n/P;D'
И расширить поиск при ограничении моего окна - с 0 до 9 и 0 и с 3 строк до двух.
В любом случае, вы поняли идею.