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?

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

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.


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.