Con sed
usted puede hacer una ventana deslizante.
sed '1N;$!N;/141.299.99.1/P;D'
Eso lo hace. ¡Pero cuidado - bash
el comportamiento loco de expandirse !
incluso cuando se cita! en la cadena de comandos de su historial de comandos puede hacer que se vuelva un poco loco. Prefije el comando con set +H;
si encuentra que este es el caso. Para luego volver a habilitarlo (pero ¿por qué ???) hazlo set -H
después.
Eso, por supuesto, solo se aplicaría si estuviera usando bash
, aunque no creo que lo esté haciendo. Estoy bastante seguro de que está trabajando con csh
- (que resulta ser el shell cuyo comportamiento loco bash
emula con la expansión del historial, pero tal vez no en los extremos que el shell c lo llevó) . Así que , probablemente, una \!
debería funcionar. Espero.
Todo es código portátil: POSIX describe sus tres operadores de la siguiente manera: (aunque vale la pena señalar que solo he confirmado que esta descripción existía ya en 2001)
[2addr]N
Agregue la siguiente línea de entrada, menos su línea de \n
ew final , al espacio del patrón, usando una \n
línea de ew incrustada para separar el material adjunto del material original. Tenga en cuenta que el número de línea actual cambia.
[2addr]P
Escriba el espacio del patrón, hasta el primer \n
ewline, en la salida estándar.
[2addr]D
Elimine el segmento inicial del espacio del patrón a través de la primera línea \n
ew y comience el siguiente ciclo.
Entonces, en la primera línea, agrega una línea adicional al espacio del patrón, para que se vea así:
^line 1s contents\nline 2s contents$
A continuación, en la primera línea y cada línea a partir de entonces - con excepción de la última - se agrega otra línea al espacio de patrones. Entonces se ve así:
^line 1\nline 2\nline 3$
Si su dirección IP se encuentra dentro de usted, P
diríjase a la primera línea nueva, así que solo la línea 1 aquí. Al final de cada ciclo, D
eliges lo mismo y comienzas de nuevo con lo que queda. Entonces el siguiente ciclo se ve así:
^line 2\nline 3\nline 4$
...y así. Si su IP se encuentra en cualquiera de esos tres, se imprimirá la más antigua cada vez. Entonces siempre estás solo tres líneas por delante.
Aquí hay un ejemplo rápido. Obtendré un búfer de tres líneas impreso para cada número que termine en cero:
seq 10 52 | sed '1N;$!N;/0\(\n\|$\)/P;D'
10
18
19
20
28
29
30
38
39
40
48
49
50
Eso es un poco más complicado que su caso porque tuve que alternar desde la 0\n
nueva línea o el 0$
final del espacio del patrón para parecerse más a su problema, pero son sutilmente diferentes ya que esto requiere un ancla, lo que puede ser un poco difícil de hacer ya que el espacio de patrones cambia constantemente.
Utilicé los casos impares de 10 y 52 para mostrar que mientras el ancla sea flexible, también lo será la salida. Totalmente portátil, puedo lograr los mismos resultados al contar con el algoritmo y hacer:
seq 10 52 | sed '1N;$!N;/[90]\n/P;D'
Y ampliar la búsqueda al tiempo que restringe mi ventana: de 0 a 9 y 0 y de 3 líneas a dos.
De todos modos, entiendes la idea.