Redirigir la salida de la queue a un file y luego detener cuando se encuentre el partido

Hay este file de logging que los datos que ingresan son continuos. Lo que quería que sucediera es colocar el file de logging en la queue y luego networkingirigirlo a un file con las condiciones de ff

ejemplo del contenido de los files de logging

aaaaaaaaaaaaaaa bbbbbbbbbbbbbbb ccccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee fffffffffffffff ggggggggggggggg hhhhhhhhhhhhhhh iiiiiiiiiiiiiii 

en el seguimiento, quiero que la networkingirección comience cuando encuentre el primer patrón y luego detenga el redirect y el seguimiento cuando encuentre el segundo patrón. p.ej

Quiero que la networkingirección comience cuando encuentre el patrón "ddddddddddddddd" luego se detendrá cuando encuentre "hhhhhhhhhhhhhhh". El contenido del file creado a partir de la networkingirección debería ser

 ddddddddddddddd eeeeeeeeeeeeeee fffffffffffffff ggggggggggggggg hhhhhhhhhhhhhhh 

En la encoding, estoy pensando en algo como esto. Pero no tengo idea de cómo detener la networkingirección cuando encontró el segundo patrón.

 tail -f logfile > log.tmp while grep "ddddddddddddddd" log.tmp do cat log.tmp > logfile done 

Esto es exactamente lo que hace el retail . retail es queue con expresiones regulares, una herramienta que escribí para el caso de uso exacto que tienes aquí. En tu caso, usarías:

 retail -f -r ddddddddddddddd -u hhhhhhhhhhhhhhh logfile > log.tmp 

-f es la opción estándar tail -f . -r toma una expresión regular para usar para iniciar el range de líneas para include, y -u toma una expresión regular para que continúe hasta. Comienza en la última aparición del patrón -r y sale después de imprimir la primera aparición del patrón -u partir de ese momento.

Si desea comenzar desde la primera instancia del patrón, puede usar -b en combinación con -r . Ambas expresiones regulares son ERE , sin ningún anclaje implícito, pero puede usar ^ y $ para anclar la coincidencia como de costumbre.


Puede get y build retail por retail con:

 git clone https://github.com/mwh/retail.git cd retail ./configure make make install 

Se instala en ~/.local/bin de forma pnetworkingeterminada, pero puede cambiar eso, o simplemente copyr el ejecutable donde lo desee.


retail es totalmente compatible con POSIX , aunque no recomiendo realmente usarlo como la tail su sistema.

Si entiendo tus demandas correctas, esto hace lo que esperas:

 awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/ { print > "excerpt" } 1' infile | tail -f 

awk funciona como filter en el file "infile"; imprime todo entre los patrones dados en un file "extracto", y también imprime cada línea en salida estándar, que luego es procesada por tail -f como de costumbre.

En caso de que quiera usarlo con los datos transmitidos:

 some_process | awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/ { print > "excerpt" } 1' | tail -f 

(Nota: Dado que tail -f es un progtwig interactivo, debe venir, si es posible, siempre durará en una tubería).

Tal vez puedas usar los patrones de range de awk aquí:

 tail -f logfile | awk '/ddddddddddddddd/,/hhhhhhhhhhhhhhh/' 

Si necesita eludir el problema SIGPIPE , puede usar socat lugar de tail para el trabajo:

 socat -u file:logfile,ignoreeof "system:'stdbuf -o0 awk /ddddddddddddddd/,/hhhhhhhhhhhhhhh/'" > logfile.new