2009-06-09 6 views
26

J'utilise 'tail -f' pour suivre un fichier journal car il est mis à jour; Ensuite, je redirige la sortie de cela vers grep pour afficher uniquement les lignes contenant un terme de recherche ("org.springframework" dans ce cas); enfin je voudrais faire est redirigeant la sortie de grep à une troisième commande, « coupé »Comment acheminer l'entrée via grep vers un autre utilitaire?

tail -f logfile | grep org.springframework | cut -c 25- 

La commande cut supprimerait les 25 premiers caractères de chaque ligne pour moi si elle pouvait obtenir l'entrée de grep! (Cela fonctionne comme prévu si j'élimine 'grep' de la chaîne.)

J'utilise cygwin avec bash.

Résultats réels: Lorsque j'ajoute le deuxième canal pour me connecter à la commande 'couper', le résultat est qu'il se bloque, comme s'il attendait une entrée (au cas où vous vous poseriez la question).

+0

Si je me arrête après grep (sans tuyau pour « couper ») , ça marche (sans dépouiller les premiers 24 ou 25 caractères). – les2

+0

Le vrai problème ici, c'est que 'tail -f' ne finit jamais, donc le reste du pipeline continue d'attendre plus de données – Hasturkun

Répondre

10

Sur mon système, environ 8K était tamponné avant d'avoir une sortie. Cette séquence a travaillé pour suivre le fichier immédiatement:

tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done 
+0

je viens de revenir à cela et celui-ci a travaillé – les2

-1

Ce que vous avez devrait fonctionner correctement - c'est l'idée même des pipelines. Le seul problème que je vois est que, dans la version de cut j'ai (GNU coreutiles 6.10), vous devez utiliser la syntaxe cut -c 25- (à savoir utiliser un signe moins au lieu d'un signe plus) pour supprimer les 24 premiers caractères.

Vous recherchez également différents modèles dans vos deux exemples, au cas où cela s'avérerait pertinent.

+0

oups! J'utilise le signe 'moins' - c'était une faute de frappe dans mon article ici – les2

29

En supposant GNU grep, ajoutez --line-buffered à votre ligne de commande, par exemple.

tail -f logfile | grep --line-buffered org.springframework | cut -c 25- 

Edit:

Je vois tampon grep est pas le seul problème ici, comme coupe ne permet pas de mise en mémoire tampon linewise.

vous pouvez essayer de le remplacer par quelque chose que vous pouvez contrôler, comme sed:

tail -f logfile | sed -u -n -e '/org\.springframework/ s/\(.\{0,25\}\).*$/\1/p' 

ou awk

tail -f logfile | awk '/org\.springframework/ {print substr($0, 0, 25);fflush("")}' 
+1

- ligne-buffered n'a pas fonctionné pour moi - qui tamponne la * sortie * de grep. Si vous faites tail -f logfile | cut -c 25- il reste juste là. La mise en mémoire tampon est en cours sur la sortie de la queue. –

+0

Révisé, semble que vous êtes mordu par stdout buffering en coupe, ceux-ci devraient travailler pour vous – Hasturkun

+0

Merci! C'est vraiment utile lorsque vous enchaînez plusieurs greps. par exemple. someprogwithoutput | grep - filtre-filtre tamponné en ligne | grep --color highlightpattern – Superole

Questions connexes