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?

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

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.


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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.