Com sed
você pode fazer uma janela deslizante.
sed '1N;$!N;/141.299.99.1/P;D'
Isso faz. Mas cuidado - bash
o comportamento insano de se expandir !
mesmo quando citado !!! na cadeia de comando do seu histórico de comandos pode torná-lo um pouco louco. Prefixe o comando com set +H;
se você achar que este é o caso. Para reativá-lo (mas por que ???), faça set -H
depois.
Isso, é claro, só se aplicaria se você estivesse usando bash
- embora eu não acredite que você esteja. Tenho certeza de que você está trabalhando csh
- (que é o shell cujo comportamento insano bash
emula a expansão do histórico, mas talvez não nos extremos que o shell c levou) . Então, provavelmente, um \!
deve funcionar. Eu espero.
É tudo código portátil: o POSIX descreve seus três operadores assim: (embora valha a pena notar que eu apenas confirmei que essa descrição existia já em 2001)
[2addr]N
Anexe a próxima linha de entrada, menos sua linha de \n
ew final , ao espaço do padrão, usando uma \n
linha de ew incorporada para separar o material anexado do material original. Observe que o número da linha atual é alterado.
[2addr]P
Escreva o espaço do padrão, até a primeira linha de \n
ew, na saída padrão.
[2addr]D
Exclua o segmento inicial do espaço do padrão pela primeira linha de \n
ew e inicie o próximo ciclo.
Portanto, na primeira linha, você adiciona uma linha extra ao espaço do padrão, para que fique assim:
^line 1s contents\nline 2s contents$
Em seguida, na primeira linha e em todas as linhas posteriores - exceto a última -, você adiciona outra linha ao espaço do padrão. Então fica assim:
^line 1\nline 2\nline 3$
Se o seu endereço IP for encontrado dentro de você, você será P
direcionado para a primeira nova linha, então apenas a linha 1 aqui. No final de cada ciclo, você D
elimina o mesmo e recomeça com o que resta. Portanto, o próximo ciclo se parece com:
^line 2\nline 3\nline 4$
...e assim por diante. Se o seu ip for encontrado em qualquer um desses três, o mais antigo será impresso - sempre. Então você está sempre apenas três linhas à frente.
Aqui está um exemplo rápido. Vou imprimir um buffer de três linhas para cada número que termina em zero:
seq 10 52 | sed '1N;$!N;/0\(\n\|$\)/P;D'
10
18
19
20
28
29
30
38
39
40
48
49
50
Isso é um pouco mais complicado do que o seu caso, porque eu tive que alternar entre a 0\n
nova linha ou o 0$
fim do espaço do padrão para se parecer mais com o seu problema - mas eles são sutilmente diferentes, pois isso requer uma âncora - o que pode ser um pouco difícil, pois o espaço-padrão muda constantemente.
Usei os casos ímpares de 10 e 52 para mostrar que, desde que a âncora seja flexível, o mesmo ocorre com a saída. Totalmente portável, posso obter os mesmos resultados contando com o algoritmo e:
seq 10 52 | sed '1N;$!N;/[90]\n/P;D'
E amplie a pesquisa enquanto restringe minha janela - de 0 a 9 e 0 e de 3 linhas para duas.
Enfim, você entendeu a idéia.