Com sed
você pode fazer uma janela deslizante.
sed '1N;$!N;/141.299.99.1/P;D'
Isso faz isso. Mas cuidado - o comportamento insano de bash
de expandir !
mesmo quando citado !!! na sequência de comandos do histórico de comandos pode deixá-lo um pouco louco. Prefixe o comando com set +H;
se você achar que é esse 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. Eu sou bastante certo que você está trabalhando com csh
- (que é o shell cujo comportamento insano bash
emula com a expansão do histórico, mas talvez não para os extremos que o shell c levou) . Então, provavelmente , um \!
deve funcionar. Eu espero.
É tudo código portátil: POSIX descreve seus três operadores: (embora Vale a pena notar que eu só confirmei que esta descrição existia em 2001)
[2addr]N
Append the next line of input, less its terminating \n
ewline, to the pattern space, using an embedded \n
ewline to separate the appended material from the original material. Note that the current line number changes.
[2addr]P
Write the pattern space, up to the first \n
ewline, to standard output.
[2addr]D
Delete the initial segment of the pattern space through the first \n
ewline and start the next cycle.
Portanto, na primeira linha, você adiciona uma linha extra ao espaço do padrão, por isso é assim:
^line 1s contents\nline 2s contents$
Então, na primeira linha e em todas as linhas posteriores - exceto a última - você adiciona outra linha ao espaço padrão. Então parece com isso:
^line 1\nline 2\nline 3$
Se o seu endereço IP for encontrado dentro de você P
rint até a primeira nova linha, apenas a linha 1 aqui. No final de cada ciclo você D
elete mesmo e começar de novo com o que resta. Então, 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 dos três, o mais antigo será impresso - todas as vezes. Então você está sempre somente três linhas adiante.
Aqui está um exemplo rápido. Eu vou ter um buffer de três linhas impresso 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
Esse é um pouco mais complicado que o seu caso porque eu tive que alternar entre 0\n
newline ou 0$
end do espaço de padrões para parecer mais próximo do seu problema - mas eles são sutilmente diferentes porque isso requer uma âncora - o que pode ser um pouco difícil de fazer, já que o padrão espacial muda constantemente.
Eu usei os casos ímpares de 10 e 52 para mostrar que, contanto que a âncora seja flexível, a saída também é. Totalmente portável, posso obter os mesmos resultados contando com o algoritmo e fazendo:
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 a duas.
De qualquer forma, você tem a ideia.