2017-05-15 8 views
1
counter=$(grep -n 'ABC' $1 | sed 's/:[a-zA-Z0-9 ]*;//' > $2 | wc -l); 

echo $counter; #Output is 0? 

la valeur du compteur doit être la sortie de wc -l droite? Pourquoi est-ce que je trouve que c'est zéro? J'utilise zsh. Si j'exécute la commande directement, je n'ai aucun problème. Est-ce que c'est quelque chose à faire avec wc qu'il imprime quelque chose mais retourne quelque chose d'autre? Comment est-ce que je fais ceci correctement?L'évaluation d'une commande dans le tuyau bash mais la valeur de retour est erronée


Qu'est-ce que je fais? J'imprime les numéros de ligne en utilisant grep et en utilisant sed Je supprime le contenu de la ligne et en utilisant wc je compte le nombre de lignes que la sortie a.


Edit:

directement sur la coque fdgs


motrice Ulterior:

Mon motif inavoué est de diviser un fichier. Pour ce faire, j'identifie des numéros de ligne. Donc, en utilisant grep je suis à la recherche d'un certain texte (comme vous pouvez le voir est SET SCHEMA, dans l'image). Je ne veux pas que le contenu des lignes soit juste un numéro de ligne, alors je coupe les lignes en identifiant le début et la fin. En utilisant wc -l je compte les lignes.

+0

Vous redirigez la sortie de 'sed' dans un fichier, donc' wc' toujours compter 0 lignes. –

+0

Pourquoi est-ce que j'obtiens une réponse quand je la lance directement dans bash –

+0

Que voulez-vous dire? Je vous dis de supprimer la redirection: 'counter = $ (grep -n 'ABC' $ 1 | sed 's /: [a-zA-Z0-9] *; //' | wc -l);' (supprimez le '' $ 2' de la commande 'sed'). –

Répondre

2

Vous ne pouvez pas rediriger la sortie à la fois à un tuyau et également dans un fichier en même temps directement . Pour ce faire, vous pouvez utiliser la commande tee:

... | sed 's/:[a-zA-Z0-9 ]*;//' | tee "$2" | ... 
+0

Je ne comprends pas pourquoi la redirection a fonctionné directement sur le terminal alors? –

+0

Si vous venez de rediriger la commande (sans tee), vous ne devriez voir aucune sortie – user000001

+0

Veuillez vérifier la modification. J'ai 20 comme réponse –

1

Essayez:

counter=$(grep -n 'ABC' $1 | sed 's/:[a-zA-Z0-9 ]*;//' | wc -l); 

echo $counter; #Output is 0? 

Que voulez atteindre avec la commande sed?

Vous aussi pouvez utiliser ceci:

counter=$(grep -n 'ABC' $1 | wc -l); 

Cette commande:

grep -n 'ABC' $1 

obtenir la sortie suivante:

1:ABC 3:ABC 

Maintenant, vous voulez compter l'apparition de 'ABC'. Dans ce cas 2, non?

Un grep simple avec wc fait le travail ou ai-je tort?

grep -n 'ABC' $1 | wc -l 

wc manpage:

-l, --lines imprimer la nouvelle ligne compte

+0

Comme vous pouvez le voir, j'utilise la commande sed pour imprimer le numéro de ligne dans un fichier. –

+0

Pourriez-vous s'il vous plaît me dire quel devrait être exactement votre résultat? Je vais essayer de t'aider. –

+0

Je suis en train d'éditer la question. wait –