З допомогою sedвас можна зробити розсувне вікно.
sed '1N;$!N;/141.299.99.1/P;D'
Це робить це. Але будьте обережні - bashбожевільна поведінка розширюється ! навіть при цитуванні !!! в командний рядок з вашої історії команд може злегка зійти з розуму. Префікс команди, set +H;якщо ви виявите, що це так. Щоб потім повторно ввімкнути це (але чому ???), зробіть set -Hпотім.
Це, звичайно, буде застосовуватися тільки тоді , коли ви були з допомогою bash- хоча я не вірю , що ти. Я абсолютно впевнений , що ви працюєте з csh- (що трапляється шкаралупа , чия поведінка божевільного bashемулює з розширенням історії, але , можливо , не до крайнощів З оболонкою взяла її) . Так , ймовірно\! , повинен працювати. Я сподіваюсь.
Це все переносний код: POSIX так описує свої три оператори: (хоча варто зазначити, що я лише підтвердив, що цей опис існував ще в 2001 році)
[2addr]N
Додайте наступний рядок введення, за вирахуванням його закінчувальної \nлінії виходу, до простору шаблону, використовуючи вбудовану \nлінію ewline для відокремлення доданого матеріалу від вихідного матеріалу. Зауважте, що номер поточного рядка змінюється.
[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 рядків до двох.
У будь-якому випадку ви отримуєте ідею.