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