Dzięki sedniemu możesz zrobić przesuwane okno.
sed '1N;$!N;/141.299.99.1/P;D'
To wystarczy Ale uwaga - bashszalone zachowanie rozwija się, ! nawet gdy jest cytowane !!! do ciągu poleceń z historii poleceń może sprawić, że trochę oszaleje. W set +H;przypadku znalezienia takiej sytuacji należy poprzedzić ją komendą . Aby następnie ponownie włączyć (ale dlaczego ???) zrobić set -Hpóźniej.
To, oczywiście, miałaby zastosowanie tylko wtedy, gdy zostały użyciu bash- choć nie wierzę jesteś. Jestem całkiem pewien, że pracujesz csh- (która okazuje się być powłoką, której szalone zachowanie bashnaśladuje ekspansję historii, ale być może nie do końca, jak to c) . Więc prawdopodobnie\! powinno działać. Mam nadzieję.
To wszystko przenośny kod: POSIX opisuje w ten sposób swoje trzy operatory: (chociaż warto zauważyć, że potwierdziłem, że ten opis istniał już w 2001 roku)
[2addr]N
Dołącz następny wiersz danych wejściowych, pomniejszając \nkońcową ewlinię, do przestrzeni wzoru, używając osadzonej \newline, aby oddzielić dołączony materiał od materiału oryginalnego. Zauważ, że bieżący numer linii zmienia się.
[2addr]P
Zapisz przestrzeń wzorca, aż do pierwszego \nwiersza, na standardowe wyjście.
[2addr]D
Usuń początkowy segment przestrzeni wzorów przez pierwszą \nlinię ewline i rozpocznij następny cykl.
Tak więc w pierwszym wierszu dodajesz dodatkową linię do obszaru wzorów, więc wygląda to tak:
^line 1s contents\nline 2s contents$
Następnie w pierwszej linii i każdej kolejnej linii - z wyjątkiem ostatniej - dodajesz kolejną linię do obszaru wzorów. Wygląda to tak:
^line 1\nline 2\nline 3$
Jeśli twój adres IP zostanie znaleziony w tobie, Print do pierwszej nowej linii, więc po prostu wiersz 1 tutaj. Pod koniec każdego cyklu robisz to Dsamo i zaczynasz od nowa. Następny cykl wygląda następująco:
^line 2\nline 3\nline 4$
...i tak dalej. Jeśli twoje IP ma być znalezione na którymś z tych trzech, najstarsze wydrukuje - za każdym razem. Więc zawsze masz tylko trzy linie do przodu.
Oto szybki przykład. Otrzymam trzywierszowy bufor dla każdej liczby kończącej się na zero:
seq 10 52 | sed '1N;$!N;/0\(\n\|$\)/P;D'
10
18
19
20
28
29
30
38
39
40
48
49
50
Ten jest trochę bardziej skomplikowany niż twój przypadek, ponieważ musiałem przełączyć się z 0\nnowej linii lub 0$końca obszaru wzorów, aby bardziej przypominać twój problem - ale są one nieco inne, ponieważ wymaga to zakotwiczenia - co może być trochę trudne, ponieważ przestrzeń wzorów stale się zmienia.
Użyłem nieparzystych przypadków 10 i 52, aby pokazać, że tak długo, jak kotwica jest elastyczna, tak samo jak wynik. W pełni przenośny, mogę osiągnąć te same wyniki, zamiast tego licząc na algorytm i wykonując:
seq 10 52 | sed '1N;$!N;/[90]\n/P;D'
I poszerz wyszukiwanie, ograniczając moje okno - od 0 do 9 i 0 oraz od 3 linii do dwóch.
W każdym razie masz pomysł.