Jak korzystać z grep, gdy plik nie zawiera łańcucha

26

W moim skrypcie bash próbuję wydrukować wiersz, jeśli określony ciąg nie istnieje w pliku.

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

Tak to napisałem, jeśli chciałem, aby ciąg istniał w pliku, ale jak mogę to zmienić, aby wydrukować „użytkownik nie istnieje”, jeśli nie ma go w pliku / etc / passwd?

Chirag Vijay
źródło

Odpowiedzi:

49

grepzwróci sukces, jeśli znajdzie co najmniej jedno wystąpienie wzorca, a niepowodzenie, jeśli nie. Możesz więc dodać elseklauzulę, jeśli chcesz, aby drukowano zarówno „robi”, jak i „nie”, lub możesz po prostu zanegować ifwarunek, aby uzyskać tylko awarie. Przykład każdego:

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
źródło
2

Alternatywą jest poszukiwanie statusu wyjścia grep. Na przykład:

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

Jeśli grepnie uda się znaleźć dopasowania, zostanie zakończone 1, podobnie $?będzie 1. grepzawsze wróci, 0jeśli się powiedzie. Jest więc bezpieczniejszy w użyciu $? != 0niż $? == 1.

ssanch
źródło
to naprawdę tylko dłuższy sposób na powiedzenie tego , co powiedział Eric .
Jeff Schaller
Cóż, dla mnie negatywne if ! grep ...stwierdzenie nie zadziałało. To jest alternatywa.
ssanch
1

Rozwiązuję to za pomocą jednej linijki:

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

Polecenie sprawdzi wszystkie pliki w katalogu z rozszerzeniem txt i albo napisze szukany ciąg (tj. „Zadania:”), jeśli zostanie znaleziony, albo nazwę pliku.

matrik
źródło
0

Możesz użyć opcji grep „-L / --files-without-match” , aby sprawdzić, czy plik nie zawiera łańcucha:

if [[ $(grep -L "$user2" /etc/passwd) ]]; then   
  echo "User does not exist!!"; 
fi
Noam Manos
źródło