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

26

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 die Zeichenfolge in der Datei vorhanden sein soll, aber wie kann ich dies ändern, damit "Benutzer existiert nicht" gedruckt wird, wenn der Benutzer nicht in der Datei / etc / passwd gefunden wird?

Chirag Vijay
quelle

Antworten:

49

grepGibt Erfolg zurück, wenn mindestens eine Instanz des Musters gefunden wird, andernfalls Fehler. Sie können also entweder eine elseKlausel hinzufügen , wenn Sie sowohl "does" - als auch "does not" -Drucke wünschen, oder Sie können die ifBedingung einfach 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
Eric Renouf
quelle
2

Eine Alternative ist, nach dem Exit-Status von zu suchen grep. Beispielsweise:

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

Wenn grepkeine Übereinstimmung gefunden wird 1, wird dies $?auch der Fall sein 1. grepwird immer zurückkehren, 0wenn erfolgreich. So ist es sicherer zu bedienen $? != 0als $? == 1.

ssanch
quelle
Das ist wirklich nur eine längere Art zu sagen, was Eric gesagt hat .
Jeff Schaller
Nun, für mich hat die negative if ! grep ...Aussage nicht funktioniert. Das ist also eine Alternative.
ssanch
1

Ich löse es mit einem einfachen Liner:

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 (dh "tasks:"), falls gefunden, oder den Namen der Datei.

matrik
quelle