Con sed
te puoi fare una finestra scorrevole.
sed '1N;$!N;/141.299.99.1/P;D'
Questo lo fa. Ma attenzione - bash
il comportamento folle di espandersi !
anche quando citato !!! nella stringa di comando dalla cronologia dei comandi potrebbe renderlo un po 'folle. Prefisso il comando con set +H;
se trovi questo è il caso. Per poi riattivarla (ma perchè ???) fareset -H
in seguito.
Questo, naturalmente, si applicherebbe solo se si stesse utilizzando bash
- anche se non credo che ci si trovi. Sono abbastanza sicuro con cui stai lavorando csh
- (che sembra essere la shell il cui comportamento folle bash
emula con l'espansione della storia, ma forse non agli estremi che la shell ha preso) . Quindi probabilmente a\!
dovrebbe funzionare. Io spero.
È tutto un codice portatile: POSIX descrive così i suoi tre operatori: (anche se vale la pena notare che ho solo confermato che questa descrizione esisteva già nel 2001)
[2addr]N
Aggiungi la riga successiva di input, meno la sua \n
ewline finale, allo spazio del pattern, usando un incorporato\n
ewline per separare il materiale aggiunto dal materiale originale. Si noti che il numero di riga corrente cambia.
[2addr]P
Scrivi lo spazio del modello, fino al primo \n
ewline, sull'output standard.
[2addr]D
Elimina il segmento iniziale dello spazio del motivo attraverso la prima \n
ewline e avvia il ciclo successivo.
Quindi sulla prima riga aggiungi una linea extra allo spazio del motivo, quindi è simile al seguente:
^line 1s contents\nline 2s contents$
Quindi sulla prima riga e su ogni riga successiva, tranne l'ultima, si aggiunge un'altra riga allo spazio del motivo. Quindi sembra così:
^line 1\nline 2\nline 3$
Se il tuo indirizzo IP si trova dentro di te, vai P
alla prima riga, quindi basta la riga 1 qui. Alla fine di ogni ciclo si D
elimina lo stesso e si ricomincia da capo con ciò che rimane. Quindi il prossimo ciclo assomiglia a:
^line 2\nline 3\nline 4$
...e così via. Se il tuo IP si trova su uno di questi tre, il più vecchio verrà stampato - ogni volta. Quindi sei sempre solo tre righe avanti.
Ecco un breve esempio. Verrà stampato un buffer di tre righe per ogni numero che termina con zero:
seq 10 52 | sed '1N;$!N;/0\(\n\|$\)/P;D'
10
18
19
20
28
29
30
38
39
40
48
49
50
Questo è un po 'più complicato del tuo caso perché ho dovuto alternare da 0\n
Newline o0$
fine dello spazio del modello per assomigliare più da vicino al tuo problema - ma sono leggermente diversi in quanto ciò richiede un ancoraggio - che può essere un po' difficile da fare poiché lo spazio-modello cambia costantemente.
Ho usato i casi dispari di 10 e 52 per dimostrare che fino a quando l'ancoraggio è flessibile, lo è anche l'output. Completamente portabile, posso ottenere gli stessi risultati contando invece sull'algoritmo e facendo:
seq 10 52 | sed '1N;$!N;/[90]\n/P;D'
E amplia la ricerca limitando la mia finestra - da 0 a 9 e 0 e da 3 righe a due.
Ad ogni modo, hai avuto l'idea.