2009-09-03 7 views
1

Je construis souvent de longs tuyaux multi-commandes sous Linux/Unix pour traiter de gros fichiers texte (sed | grep | sort | less, etc.). J'aimerais pouvoir utiliser un élément de pipeline qui tamponnerait tout ce qui est reçu via stdin jusqu'à ce qu'une phrase clé/chaîne soit détectée (par exemple "SUCCESS"), à ce point il libère tout ce qui a été reçu jusqu'à ce jour sur stdout puis continue à passer le reste du flux à travers. Si la phrase clé n'est pas détectée, le programme rejette tout le contenu.Buffering filtering pipe sur Linux

Y at-il une commande standard qui peut faire cela, ou ai-je besoin d'écrire un script Perl?

Merci d'avance pour vos idées ici!

Wodow, amoureux des tuyaux

+4

Mes compliments pour "l'amoureux des pipes" ... –

Répondre

1

probablement la solution la plus simple est d'utiliser sed:

 
    sed '/SUCCESS/,$!{H;d;};$H;x' 
+0

Cela fonctionne parfaitement ligne par ligne (après avoir testé directement à partir de la ligne de commande). – wodow

+0

Merci pour celui-ci! – wodow

2

Vous pourriez utiliser un simple awk/gawk 1 doublure pour ce faire:

EDIT: Mise à jour pour corriger le bug qui dmckee a souligné (et fixe) dans son commentaire

gawk '{somme = somme "\ n" $ 0};/Succès/{print somme} »

+0

Mignonne. – dmckee

+0

Cela ne passera pas par les lignes après "succès". – mark4o

+0

Il pourrait facilement être modifié pour le faire. – Omnifarious

0

Un moyen rapide et sale de le faire se présente comme suit:

perl -pe'$b.=$_;/SUCCESS/&&last}print$b;while(<>){' 

Mais si vous faites-le souvent, il mérite un script qui lui est propre.