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

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

sudo dmidecode | grep ThinkPad 

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

Я думаю, что решение может быть примерно таким:

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

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

  • find + xargs: строка аргумента слишком длинная
  • xargs не работает в Linux, поскольку работает в Unix
  • Предложение xargs grep
  • «Список аргументов слишком длинный»: как мне с этим справиться, не меняя мою команду?
  • Как использовать scp с xargs?
  • Почему xargs заставляет apt-get прерываться?
  • Передача списка из двух PID для xargs только убивает первый, используя ssh
  • Как подключить вывод netcat? Проблемы с xargs и кавычками
  • 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 - лучшая ОС в мире.