get la sortie et renvoyer la valeur de grep en une seule opération dans bash

J'écris un script bash; J'exécute une certaine command et grep.

pfiles $1 2> /dev/null | grep name # $1 Process Id 

La réponse sera quelque chose comme:

 sockname: AF_INET6 ::ffff:10.10.50.28 port: 22 peername: AF_INET6 ::ffff:10.16.6.150 port: 12295 

La réponse peut être sans lignes, 1 ligne ou 2 lignes.
Au cas où grep ne renvoie pas de lignes (grep return code 1), j'annule le script; si j'obtiens une ligne, j'invoque A () ou B () si plus d'une ligne. Le code de return de grep est 0 lorsque la sortie est de 1-2 lignes.

grep a une valeur de return (0 ou 1) et une sortie.
Comment puis-je les attraper tous les deux? Si je fais quelque chose comme:

 OUTPUT=$(pfiles $1 2> /dev/null | grep peername) 

Ensuite, la variable OUTPUT aura la sortie (string); Je veux aussi la valeur booleanne de l'exécution de grep.

Vous pouvez utiliser

 output=$(grep -c 'name' inputfile) 

La output variable contiendra alors le nombre 0 , 1 ou 2 . Ensuite, vous pouvez utiliser une instruction if pour exécuter différentes choses.

Si vous avez besoin du résultat de grep , vous ne pouvez pas utiliser l' -c comme indiqué dans l'autre réponse. Ce que vous pouvez faire, cependant, fonctionne deux fois, une fois avec le drapeau -c pour get le nombre de matches et un sans le drapeau -c pour voir les matchs. Cependant, cela peut être très inefficace, en fonction de la taille de votre file d'input.

Vous pouvez faire quelque chose comme ceci:

Contenu de l' input :

 The first line is foo I have a drink at the bar The third line is foo again 

Contenu du script :

 #!/usr/bin/env bash countMatches(){ echo Searching for "${1}" result=$(grep "${1}" input) if [ $? -eq 1 ]; then echo No match found echo exit 1 fi if [ $(echo "${result}" | wc -l) -eq 1 ]; then echo 1 match found: echo "${result}" echo else echo 2 matches found: echo "${result}" echo fi } countMatches foo countMatches bar countMatches baz 

Et voici la sortie lorsque vous appelez le script :

 Searching for foo 2 matches found: The first line is foo The third line is foo again Searching for bar 1 match found: I have a drink at the bar Searching for baz No match found 

C'est assez simple:

 OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername) grep_return_code=$? 

Si une substitution de command $(…) est affectée à une variable, $? obtiendra le code de return de la dernière command dans le $(…) . Et, bien sûr, vous n'avez pas besoin de vous référer à $? explicitement; vous pouvez faire des choses comme

  si OUTPUT = $ (pfiles "$ 1" 2> / dev / null | grep nom_du_jeu)
 puis
     # le rest du script
                 ︙
 Fi 

ou

  si !  OUTPUT = $ (pfiles "$ 1" 2> / dev / null | grep nom_du_jeu)
 puis
     Sortie
 Fi
 # le rest du script

Cette approche est utile dans les situations où la sortie de la command et son code de return (alias exit status) ne sont pas corrélés. Mais, pour grep , ils sont fortement corrélés: s'il a produit une sortie, il a réussi. S'il n'a pas produit de sortie, il a échoué. Alors, pourquoi ne pas simplement tester la sortie ?

  OUTPUT = $ (pfiles "$ 1" 2> / dev / null | grep nom_du_jeu)
 si ["$ OUTPUT"]
 puis
     # le rest du script
                 ︙
 Fi 

ou

  OUTPUT = $ (pfiles "$ 1" 2> / dev / null | grep nom_du_jeu)
 si [ -z "$ OUTPUT"]
 puis
     Sortie
 Fi
 # le rest du script

PS Vous devriez toujours citer vos references de variables de shell (par exemple, "$1" ), sauf si vous avez une bonne raison de ne pas le faire, et vous êtes sûr de savoir ce que vous faites.

Essayez ce code, je le sens, il fait ce que vous voulez.

  1. J'ai mis la sortie grep à la variable OUTPUT
  2. Je pense que vous n'avez pas besoin du statut de sortie grep comme valeur booleanne. C'est 0 ou 1, et cela ne convient pas à votre tâche. Vous avez besoin de la quantité de lignes – 0, 1, 2, etc. Par conséquent, countz les lignes dans la variable OUTPUT et mettez ce nombre dans la deuxième variable – line_count . Nous aurons deux variables dans le résultat. D'abord avec la sortie grep, la seconde avec la quantité de lignes.
  3. Ensuite, vérifiez line_count dans l'instruction de case et effectuez l'action requirejse.

Utilisation: ./switching_by_grep_result.sh your_file.txt

 #!/bin/bash # your code OUTPUT=$(pfiles $1 2> /dev/null | grep name) # $1 Process Id # count lines in the OUTPUT variable by using 'grep -c' line_count=$(echo -n "$OUTPUT" | grep -c '^') # checks lines count in here and invokes needed script or exit. # if 0 lines - exit # if 1 lines - invoke A # if any other number of lines - invoke B case $line_count in 0) echo 'exit' ;; 1) echo 'A() script invoking here' ;; *) echo 'B() script invoking here' ;; esac