Avec sed
vous pouvez faire une fenêtre coulissante.
sed '1N;$!N;/141.299.99.1/P;D'
Ça le fait. Mais méfiez-vous bash
du comportement fou de l'expansion !
même lorsqu'il est cité !!! dans la chaîne de commande de votre historique de commande pourrait le rendre un peu fou. Préfixez la commande avec set +H;
si vous trouvez que c'est le cas. Pour ensuite le réactiver (mais pourquoi ???), faites-le set -H
ensuite.
Cela, bien sûr, ne s'appliquerait si vous étiez utilisez bash
- bien que je ne crois pas que vous êtes. Je suis assez certain que vous travaillez avec csh
- (qui se trouve être le shell dont le comportement insensé bash
émule avec l'expansion de l'historique, mais peut-être pas aux extrêmes que le shell c a pris) . Donc , probablement un \!
devrait fonctionner. J'espère.
Tout est du code portable: POSIX décrit ainsi ses trois opérateurs: (même s'il convient de noter que je n'ai confirmé que cette description existait déjà en 2001)
[2addr]N
Ajoutez la ligne d'entrée suivante, moins sa ligne terminale \n
, à l'espace de motif, en utilisant une ligne intégrée \n
pour séparer le matériau ajouté du matériau d'origine. Notez que le numéro de ligne actuel change.
[2addr]P
Écrivez l'espace de motif, jusqu'à la première ligne \n
électronique, sur la sortie standard.
[2addr]D
Supprimez le segment initial de l'espace de motif via la première ligne \n
électronique et démarrez le cycle suivant.
Donc, sur la première ligne, vous ajoutez une ligne supplémentaire à l'espace de motif, cela ressemble à ceci:
^line 1s contents\nline 2s contents$
Ensuite, sur la première ligne et chaque ligne suivante - à l'exception de la toute dernière - vous ajoutez une autre ligne à l'espace de motif. Il ressemble donc à ceci:
^line 1\nline 2\nline 3$
Si votre adresse IP se trouve en vous, P
imprimez jusqu'à la première nouvelle ligne, alors juste la ligne 1 ici. À la fin de chaque cycle, vous les D
supprimez et recommencez avec ce qui reste. Le prochain cycle ressemble donc à:
^line 2\nline 3\nline 4$
...etc. Si votre adresse IP se trouve sur l'un de ces trois, le plus ancien s'imprimera - à chaque fois. Vous n'avez donc que trois lignes d'avance.
Voici un petit exemple. Je vais faire imprimer un tampon de trois lignes pour chaque numéro se terminant par zéro:
seq 10 52 | sed '1N;$!N;/0\(\n\|$\)/P;D'
10
18
19
20
28
29
30
38
39
40
48
49
50
Celui-ci est un peu plus compliqué que votre cas, car j'ai dû alterner entre la 0\n
nouvelle ligne ou la 0$
fin de l'espace de motif pour ressembler davantage à votre problème - mais ils sont subtilement différents en ce sens que cela nécessite une ancre - ce qui peut être un peu difficile à faire car l'espace-modèle change constamment.
J'ai utilisé les cas étranges de 10 et 52 pour montrer que tant que l'ancre est flexible, la sortie l'est également. De manière totalement portable, je peux obtenir les mêmes résultats en comptant plutôt sur l'algorithme et en faisant:
seq 10 52 | sed '1N;$!N;/[90]\n/P;D'
Et élargissez la recherche tout en restreignant ma fenêtre - de 0 à 9 et 0 et de 3 lignes à deux.
Quoi qu'il en soit, vous avez l'idée.