Як використовувати grep, коли файл не містить рядка


26

У моєму скрипті bash я намагаюся надрукувати рядок, якщо певний рядок у файлі не існує.

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

Ось як я написав це, якщо хотів, щоб рядок існував у файлі, але як я можу змінити це, щоб він надрукував "користувача не існує", якщо користувача не знайдено у файлі / etc / passwd?

Відповіді:


49

grepповерне успіх, якщо він знайде принаймні один екземпляр шаблону і невдачу, якщо цього немає. Таким чином, ви можете або додати elseпункт, якщо ви хочете друкувати і "не", і "не", або ви могли просто заперечити ifумову, щоб отримати лише збої. Приклад кожного:

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

Альтернативою є пошук статусу виходу grep. Наприклад:

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

Якщо grepне вдасться знайти відповідник, він вийде 1, так $?і буде 1. grepзавжди повернеться в 0разі успіху. Так що безпечніше використовувати, $? != 0ніж $? == 1.


це дійсно просто довший спосіб сказати те, що сказав Ерік .
Джефф Шаллер

Ну, для мене негативне if ! grep ...твердження не спрацювало. Тож це альтернатива.
ssanch

1

Я вирішую це простим одним вкладишем:

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

Команда перевірить усі файли в каталозі з розширенням txt і запише рядок пошуку (тобто "задачі:"), якщо вона знайдена, або ж ім'я файлу.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.