Как использовать 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.

ssanch
источник
это действительно просто более длинный способ сказать то, что сказал Эрик .
Джефф Шаллер
Ну, для меня отрицательное if ! grep ...утверждение не сработало. Так что это альтернатива.
ssanch
1

Я решаю это простым одним вкладышем:

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

Команда проверит все файлы в каталоге с расширением txt и либо напишет строку поиска (т.е. «tasks:»), если найдена, либо имя файла.

matrik
источник