Mit sedkönnen Sie ein Schiebefenster machen.
sed '1N;$!N;/141.299.99.1/P;D'
Das tut es. Aber Vorsicht - es ist bashein verrücktes Verhalten, sich zu erweitern, ! selbst wenn es zitiert wird !!! Wenn Sie den Befehlsstring aus Ihrem Befehlsverlauf eingeben, wird er möglicherweise etwas verrückt. Stellen Sie dem Befehl Folgendes voranset +H; wenn dies der Fall ist. Um es dann wieder zu aktivieren (aber warum ???), mache es set -Hdanach.
Das würde natürlich nur zutreffen, wenn Sie es benutzen bash- obwohl ich nicht glaube, dass Sie es sind. Ich bin mir ziemlich sicher, dass Sie damit arbeiten csh- (das ist zufällig die Shell, deren verrücktes Verhalten bashmit der History-Erweiterung nachahmt, aber vielleicht nicht bis zu den Extremen, mit denen die c-Shell es aufgenommen hat) . So wohl einer \!funktionieren. Ich hoffe.
Es ist alles portabler Code: POSIX beschreibt seine drei Operatoren folgendermaßen: (obwohl es erwähnenswert ist, dass ich nur bestätigt habe, dass diese Beschreibung bereits 2001 existiert hat)
[2addr]N
Fügen Sie die nächste Eingabezeile abzüglich der abschließenden \newline in den Musterbereich ein. Verwenden Sie dazu eine eingebettete \newline, um das angehängte Material vom Originalmaterial zu trennen. Beachten Sie, dass sich die aktuelle Zeilennummer ändert.
[2addr]P
Schreiben Sie den Musterraum bis zur ersten \newline in die Standardausgabe.
[2addr]D
Löschen Sie das anfängliche Segment des Musterraums durch die erste \newline und starten Sie den nächsten Zyklus.
In der ersten Zeile fügen Sie dem Musterbereich eine zusätzliche Zeile hinzu. So sieht es aus:
^line 1s contents\nline 2s contents$
Dann fügen Sie in der ersten Zeile und in jeder Zeile danach - mit Ausnahme der allerletzten - eine weitere hinzu Zeile zum Musterraum hinzu. So sieht es also aus:
^line 1\nline 2\nline 3$
Wenn Ihre IP-Adresse in Ihnen Pvorkommt, geben Sie hier einfach Zeile 1 ein. Am Ende eines jeden Zyklus Dwird derselbe Vorgang ausgeführt, und Sie beginnen erneut mit dem, was noch übrig ist. Der nächste Zyklus sieht also so aus:
^line 2\nline 3\nline 4$
...und so weiter. Wenn Ihre IP-Adresse auf einer dieser drei Adressen zu finden ist, wird jedes Mal die älteste ausgedruckt. Also bist du immer nur drei Zeilen vor sich.
Hier ist ein kurzes Beispiel. Für jede Zahl, die mit Null endet, wird ein dreizeiliger Puffer gedruckt:
seq 10 52 | sed '1N;$!N;/0\(\n\|$\)/P;D'
10
18
19
20
28
29
30
38
39
40
48
49
50
Das ist ein bisschen komplizierter als in deinem Fall, weil ich mich von beiden abwechseln musste 0\n Zeilenvorschub oder 0$Ende des Musterraums Ihrem Problem näher zu kommen - aber sie unterscheiden sich geringfügig darin, dass dies einen Anker erfordert - was seitdem etwas schwierig sein kann Der Musterraum verschiebt sich ständig.
Ich habe die ungeraden Fälle 10 und 52 verwendet, um zu zeigen, dass, solange der Anker flexibel ist, auch die Ausgabe flexibel ist. Völlig portabel kann ich dieselben Ergebnisse erzielen, indem ich mich stattdessen auf den Algorithmus verlasse und Folgendes tue:
seq 10 52 | sed '1N;$!N;/[90]\n/P;D'
Und die Suche ausweiten, während ich mein Fenster einschränke - von 0 auf 9 und 0 und von 3 auf zwei Zeilen.
Wie auch immer, Sie haben die Idee.