Come usare grep quando il file non contiene la stringa


26

Nel mio script bash sto provando a stampare una riga se una determinata stringa non esiste in un file.

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

È così che l'ho scritto se volevo che la stringa esistesse nel file, ma come posso cambiarlo per farlo stampare "l'utente non esiste" se l'utente non si trova nel file / etc / passwd?

Risposte:


49

greprestituirà esito positivo se trova almeno un'istanza del modello e, in caso contrario, fallisce. Quindi potresti aggiungere una elseclausola se vuoi che sia "fa" e "non" stampi, oppure potresti semplicemente negare la ifcondizione per ottenere solo errori. Un esempio di ciascuno:

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

Un'alternativa è cercare lo stato di uscita di grep. Per esempio:

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

Se grepnon riesce a trovare una corrispondenza, uscirà 1, così $?sarà 1. greptornerà sempre in 0caso di successo. Quindi è più sicuro da usare $? != 0di $? == 1.


questo è davvero solo un modo più lungo per dire ciò che Eric ha detto .
Jeff Schaller

Bene, per me l' if ! grep ...affermazione negativa non ha funzionato. Quindi questa è un'alternativa.
ssanch,

1

Lo risolvo con un semplice liner:

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

Il comando controllerà tutti i file nella directory con estensione txt e scriverà la stringa di ricerca (ad esempio "attività:") se trovata oppure il nome del file.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.