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.
grep
à la variable OUTPUT
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. 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