Rediriger la sortie de la queue vers un file puis arrêter lorsque la correspondance est trouvée

Il y a ce file journal que datatables entrant sont continues. Ce que je voulais arriver est de tail -f ce file journal puis le redirect vers un file avec les conditions ff

exemple du contenu des files journaux

aaaaaaaaaaaaaaa bbbbbbbbbbbbbbb ccccccccccccccc ddddddddddddddd eeeeeeeeeeeeeee fffffffffffffff ggggggggggggggg hhhhhhhhhhhhhhh iiiiiiiiiiiiiii 

en queue, je veux que la redirection commence quand elle a trouvé le premier model puis arrêter la redirection ainsi que la queue quand j'ai trouvé le deuxième model. par exemple

Je veux que la redirection commence quand il a trouvé le model "ddddddddddddddd" puis s'arrête quand il a trouvé "hhhhhhhhhhhhhhh" le contenu du file créé à partir de la redirection devrait être

 ddddddddddddddd eeeeeeeeeeeeeee fffffffffffffff ggggggggggggggg hhhhhhhhhhhhhhh 

En codant, je pense à quelque chose comme ça. Mais je n'ai pas idée comment arrêter la redirection quand il a trouvé le deuxième model.

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

C'est exactement ce retail fait le retail . retail est la queue avec des expressions régulières, un outil que j'ai écrit pour exactement le cas d'utilisation que vous avez ici. Dans votre cas, vous utiliseriez:

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

-f est l'option standard tail -f . -r prend une expression régulière à utiliser pour démarrer la gamme de lignes à inclure, et -u prend une expression régulière pour continuer jusqu'à. Il commence à la dernière occurrence du motif -r et se termine après l'printing de la première occurrence du motif -u par la suite.

Si vous voulez commencer à partir de la première instance du model, vous pouvez utiliser -b en combinaison avec -r . Les deux expressions régulières sont des ERE , sans ancrage implicite, mais vous pouvez utiliser ^ et $ pour ancrer le match comme d'habitude.


Vous pouvez get et build des retail avec:

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

Il s'installe dans ~/.local/bin par défaut, mais vous pouvez le changer ou simplement copyr l'exécutable où vous voulez.


retail est entièrement compatible avec POSIX , bien que je ne recommand pas de l'utiliser comme tail votre système.

Si je comprends vos requests, cela fait ce que vous attendez:

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

awk fonctionne comme un filter sur le file "infile"; il imprime tout entre les motifs donnés dans un file "extrait", et il imprime également chaque ligne à la sortie standard, qui est ensuite traitée par la tail -f comme d'habitude.

Si vous voulez l'utiliser avec des données en streaming:

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

(Note: Puisque tail -f est un programme interactif, il devrait arriver, si possible, toujours dans un pipeline.)

Peut-être que vous pouvez utiliser les templates de gamme de awk ici:

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

Si vous avez besoin de contourner le problème SIGPIPE vous pouvez utiliser socat au lieu de la tail pour le travail:

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