Dzięki sed
niemu możesz zrobić przesuwane okno.
sed '1N;$!N;/141.299.99.1/P;D'
To wystarczy Ale uwaga - bash
szalone 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 -H
póź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 bash
naś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 \n
końcową ewlinię, do przestrzeni wzoru, używając osadzonej \n
ewline, 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 \n
wiersza, na standardowe wyjście.
[2addr]D
Usuń początkowy segment przestrzeni wzorów przez pierwszą \n
linię 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, P
rint do pierwszej nowej linii, więc po prostu wiersz 1 tutaj. Pod koniec każdego cyklu robisz to D
samo 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\n
nowej 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ł.