it-swarm.com.de

Verwendung von grep, wenn die Datei die Zeichenfolge nicht enthält

In meinem Bash-Skript versuche ich, eine Zeile zu drucken, wenn eine bestimmte Zeichenfolge in einer Datei nicht vorhanden ist.

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"

So habe ich es geschrieben, wenn ich wollte, dass die Zeichenfolge in der Datei vorhanden ist, aber wie kann ich dies ändern, damit es "Benutzer existiert nicht" druckt, wenn der Benutzer nicht in der Datei/etc/passwd gefunden wird?

29
Chirag Vijay

grep gibt Erfolg zurück, wenn mindestens eine Instanz des Musters gefunden wird, und Fehler, wenn dies nicht der Fall ist. Sie können also entweder eine else -Klausel hinzufügen, wenn Sie möchten, dass sowohl "tut" als auch "tut nicht" gedruckt wird, oder Sie können einfach die Bedingung if negieren, um nur Fehler zu erhalten. Ein Beispiel von jedem:

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"
else
    echo "User does not exist!!"
fi

if ! grep -q "$user2" /etc/passwd; then
    echo "User does not exist!!"
fi
53
Eric Renouf

Eine Alternative besteht darin, nach dem Exit-Status von grep zu suchen. Zum Beispiel:

grep -q "$user2" /etc/passwd
if [[ $? != 0 ]]; then
    echo "User does not exist!!"

Wenn grep keine Übereinstimmung findet, wird 1 Beendet, sodass $?1 Ist. grep gibt bei Erfolg immer 0 zurück. Es ist also sicherer, $? != 0 Als $? == 1 Zu verwenden.

2
ssanch

Mit der Option grep-Option "-L/--files-without-match" können Sie überprüfen, ob die Datei keine Zeichenfolge enthält:

if [[ $(grep -L "$user2" /etc/passwd) ]]; then   
  echo "User does not exist!!"; 
fi
1
Noam Manos

Ich löse es mit einem einfachen Einzeiler:

for f in *.txt; do grep "tasks:" $f || echo $f; done

Der Befehl überprüft alle Dateien im Verzeichnis mit der Erweiterung txt und schreibt entweder die Suchzeichenfolge (d. H. "Tasks:"), falls gefunden, oder den Namen der Datei.

1
matrik