OK, problema genuinamente interessante, dado que tem que funcionar no final de um cano. Pode haver maneiras mais fáceis de fazer isso, mas eu achei que este funcionava (e ele usa o Motosserra do Exército Suíço , perl):
tail -f catalina.out | perl -n -e '{ if (/^java.io.IOException: Server returned HTTP response code: 401/) { $ignore=1;} elsif ($ignore>=1 and $ignore<20) {$ignore++;} else {$ignore=0; print $_;} }'
Basicamente, ele percorre uma linha STDIN por vez, procurando a cadeia de caracteres de pesquisa (" ^ java.io.IOException: Server retornou o código de resposta HTTP: 401 "). Até ser encontrado, imprime cada linha à medida que entra; uma vez encontrada, começa a contar até 20, uma vez para cada nova linha, imprimindo nada enquanto conta; quando a contagem chega a 20, redefine a contagem para zero e retoma a impressão de cada nova linha.
Editar : não tem problema. Comece com tail -100000f catalina.out | ...
ou, na verdade, um número maior ainda se o arquivo de log tiver mais linhas do que isso. Se você não quiser ver as novas coisas conforme elas são adicionadas, tente
perl -n -e '{ if (/^java.io.IOException: Server returned HTTP response code: 401/) { $ignore=1;} elsif ($ignore>=1 and $ignore<20) {$ignore++;} else {$ignore=0; print $_;} }' < catalina.out.
Ele foi projetado para uso em um pipeline, para que você possa alimentá-lo da maneira que quiser, e enviar a saída para qualquer necessidade. É o jeito do UNIX!