2017-11-05 9 views
0

zurückkehren Wenn ich ausführen, um einen Befehl wie folgt aus:Überprüfen Sie, ob greps containsa bestimmtes Wort

~/foo/bar | grep <someID> 

die Ausgabe in diesem Format ist:

"<someID>": "ENABLED", 

Der Status „AKTIV“ kann auch etwas anderes sein, aber ich möchte überprüfen, ob meine ID FREIGEGEBEN ist

ich versuchte es mit diesem:

output= ~/foo/bar | grep <someID> 
echo $output 

if [[ $output =~ .*ENABLED.* ]]; then // Method 1 
echo "is enabled" 
else 
echo "not enabled" 
fi 

case "$output" in      // Method 2 
*ENABLED*) 
echo "is enabled" 
;; 
esac 

aber ich bekomme immer, dass es nicht aktiviert ist.

Grundsätzlich, was ich tun möchte, ist zu überprüfen, ob die Rückkehr von Grep das Wort "ENABLED" enthält.

Irgendwelche Ideen?

+0

das wie ein Stück von JSON sieht ist, so dass es eher mit einem JSON-Tool wie 'jq' verarbeitet werden soll, als ein Klartext-Tool wie' grep' –

Antwort

0

In straight-forward Weise:

some_id=2 # for example 
if ~/foo/bar | grep -q "$some_id"'": *"ENABLED"' ; then 
    echo "is enabled" 
else 
    echo "not enabled" 
fi 
+0

immer noch nicht funktioniert.Aber ich habe einen Fehler gemacht, das Ausgabeformat hat eine "-0" nach der ID angehängt, sieht so aus: " -0": "ENABLED", – Helyx

+0

@Helyx, wenn Sie einen Fehler gemacht haben - dann ändern Sie das Muster entsprechend zu "" $ some_id "'" - 0: * "ENABLED"' " – RomanPerekhrest

+0

Ich mache mir Sorgen über die Interpolation des Regex-Patterns. Es nimmt ein bestimmtes Format von' some_id' an, um sich angemessen zu verhalten. – HuStmpHrrr

0

müssen Sie Backticks in Ihrem ersten Codezeile setzen. Wenn Sie das nicht getan haben, dann könnte das Ihr Fehler sein, denn $output ist undefiniert daher leere Zeichenfolge.

0

Sowohl Ihre Strategien für den Inhalt $output Überprüfung funktionieren würde, wenn Sie nur die entsprechenden Daten in die Variable bekommen. Es gibt mehrere Möglichkeiten, um eine Befehlsausgabe in eine Variable zu erhalten. Die folgenden sind alle funktional äquivalent.

output=`~/bin/foo | grep "\"<someID>\""`  # deprecated -- use $(...) instead 

output="$(~/bin/foo | grep "\"<someID>\"")" # may result in multiple lines of output 

read -r output < <(~/bin/foo | grep "\"<someID>\"") # uses "Process Substitution" 

Die ersten beiden funktionieren in jeder alten POSIX-Shell. Der erste funktioniert sogar in csh/tcsh. Die letzte, die Prozessersetzung verwendet, ist Bash-Only (oder zumindest nicht POSIX).

Aber wie Sie in einer anderen Antwort gesehen haben, brauchen Sie wahrscheinlich keine Variable. Sie können einen regulären Ausdruck verwenden, um die ganze Zeile passen dass Sie interessiert sind:

if ~/foo/bar | grep -q "\"$someID\""'": *"ENABLED"'; then 
    echo "enabled" 
else 
    echo "disabled" 
fi 

Dieses Konstrukt ist sicherer, wenn es die Möglichkeit gibt, dass $someID mehrfach in Ihrer Ausgabe mit unterschiedlichen Werten erscheinen. Wenn Sie eine case-Anweisung verwenden, sollten Sie sicherstellen, dass Sie wissen, was zu tun ist, wenn $someID mehrfach auftaucht.

while read -r output; do 
    case "$output" in 
    *ENABLED*) echo "enabled" ;; 
    *DISABLED) echo "disabled" ;; 
    *) echo "ERROR: Unknown state." >&2 ;; 
    esac 
done < <(~/foo/bar | grep "\"$someID\"") 
0

so etwas wie dieses Versuchen:

some_command > /tmp/some_file.tmp 
if grep -q "Some_Text" "/tmp/some_file.tmp"; 
then 
echo "These are not the stormtroopers you are looking for." 
else 
echo "Stay gold, ponyboy." 
fi 

# Removing the tmp file is optional, but I'm OCD, so... 
rm /tmp/some_file.tmp 

Dieser Befehl wird für sichere Arbeit an einem Ubuntu-System aus der Box, oder jede * nix-System mit BASH Terminal. Sie können sich für Ihren eigenen Gebrauch anpassen.

Inspiriert von https://stackoverflow.com/a/28360230/4272202

Verwandte Themen