Как использовать 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 и либо напишет строку поиска (т.е. «tasks:»), если найдена, либо имя файла.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.