2014-05-06 3 views
0

Je chaîne plusieurs commandes sur la ligne de commande. Y at-il un outil qui me permettra de capturer la sortie en commençant par un modèle spécifique? Par exemple, si j'ai la sortie suivante produit:Y a-t-il un moyen de rejeter la sortie jusqu'à ce qu'un motif soit apparié?

line 1 
line 2 
line 3 
line 4 
my_pattern 
line 5 
line 6 
line 7 

Y at-il une commande qui me permettra de capturer la sortie commençant par my_pattern? Ce résultat dans les lignes

my_pattern 
line 5 
line 6 
line 7 

étant capturé. La ligne my_pattern n'est pas obligatoire pour être incluse.

+0

Eh bien cela peut aider: [en utilisant sed/awk pour sélectionner des lignes entre deux motifs qui se produisent à plusieurs reprises est en cours] (http://stackoverflow.com/q/17988756/ 1983854) – fedorqui

+1

@devnull J'ai fait. Et vous, avez-vous même vérifié la question liée? Pas besoin d'être grossier. – fedorqui

+0

@fedorqui Je suis assez sûr qu'il y aurait de bien meilleures questions qui pourraient aider par rapport à la question liée. Et demander si vous lisez la question n'est pas _rude_, ou est-ce? – devnull

Répondre

3

Bien sûr, utiliser sed comme ceci:

sed -n '/my_pattern/,$p' file 
my_pattern 
line 5 
line 6 
line 7 

Cela dit, ne pas imprimer quoi que ce soit (-n) jusqu'à ce que vous trouverez my_pattern, puis imprimez à partir de là jusqu'à la fin du fichier. Ou dans un pipeline:

.... | sed -n '/my_pattern/,$p' 
1

Vous pouvez utiliser awk comme ceci pour cette redirection de sortie:

tail -f /logs/apache_error.log | awk '!found && /my_pattern/{found=1} found' 

Ce awk ne produira pas de sortie jusqu'à ce que my_pattern se trouve dans la sortie et une fois my_pattern apparaît alors tous les le texte de sortie de tail -f sera écrit dans stdout (peut également être redirigé vers un fichier).

Test:

printf "1\n2\n3\n4\nmy_pattern\n5\n6\n7\n" | awk '!found && /my_pattern/ {found=1} found' 
my_pattern 
5 
6 
7 
Questions connexes