Один лайнер, чтобы увидеть, вернул ли grep что-то?

Я пытаюсь проверить, является ли машина ThinkPad или не использует что-то вроде этого:

sudo dmidecode | grep ThinkPad 

Я хочу, чтобы конечный результат возвращал true или false (или 1/0).

  • grep: Не признанный флаг в AIX
  • Как перечислить файлы резервных копий, отсутствующие в соответствующих файлах?
  • Есть ли файл конфигурации «rc» для grep / egrep? (~ / .egreprc?)
  • Поиск в определенном столбце для шаблона и вывода всей строки
  • Как я могу использовать инструменты unix с кириллическим текстом?
  • Как перенести часть шаблона соответствия вывода в файл, оставив остальную часть в stdout?
  • Я думаю, что решение может быть примерно таким:

     sudo dmidecode | grep -c ThinkPad | test xargs -gt 0 

    Но я не уверен, как правильно использовать xargs здесь.

  • Как извлечь XML из текстового файла
  • Разбор многомерных данных в параграфах
  • Как использовать регулярное выражение для соответствия шаблону, который не имеет определенной строки в конце
  • Как мне grep без пробелов?
  • Поиск определенного символа на одном или нескольких позициях в файле
  • Подстановка на месте для строк, соответствующих некоторому шаблону в заданном наборе файлов
  • 5 Solutions collect form web for “Один лайнер, чтобы увидеть, вернул ли grep что-то?”

    Просто снимите проверку статуса выхода после grep , она всегда будет получать статус выхода из последней команды конвейера по умолчанию:

     sudo dmidecode | grep -q ThinkPad; echo $? 

    Используйте -q для подавления любого выхода из grep поскольку мы заинтересованы только в статусе выхода.


    Вы можете использовать группировку команд, если хотите, но здесь это несколько избыточно:

     sudo dmidecode | { grep -q ThinkPad; echo $? ;} 

    Если вы собираетесь использовать этот сценарий оболочки с проверкой if , просто используйте -q как предположил heemayl:

     if sudo dmidecode | grep -q Thinkpad then echo "I'm a Thinkpad" fi 

    Поскольку блок if проверяет статус выхода команды, мы можем полагаться на статус выхода grep напрямую, а не на печать $? и сравнение его с чем-то другим.

    Вдохновленный ответом Хемаяля :

     sudo dmidecode | grep -q ThinkPad && echo true || echo false 

    Это вернет true, если ThinkPad будет найден grep и false, если нет.

    Используя command substitution test и command substitution ,

     test -n "$(sudo dmidecode | grep Thinkpad)" 

    также,

     [ -n "$(sudo dmidecode | grep Thinkpad)" ] 
     sudo dmidecode | grep -c ThinkPad | xargs test 0 -lt 

    Вам нужно переставить команды xargs и test так же как и операнды, чтобы получить то, что вы хотите. Это вернет истинный статус, если есть ненулевые (> 0) ThinkPad, содержащие строки.

    В качестве альтернативы, если вы хотите сохранить порядок операндов тестовой команды, вы можете сделать

     sudo dmidecode | grep -c ThinkPad | xargs -I \{\} test \{\} -gt 0 

    А затем, в обеих командах, проверьте значение $? значение переменной, чтобы определить судьбу успеха / неудачи grep следующим образом:

     if sudo dmidecode | grep -c ThinkPad | xargs -I \{\} test \{\} -gt 0; then echo "success hooray!" else echo nothing fi 
    Linux и Unix - лучшая ОС в мире.