Я пытаюсь grep, и он пытается работать со специальными символами.
При включенных базовых регулярных выражениях (BRE) (по умолчанию в отсутствие ключей -E , -F или -P) grep интерпретирует символ плюс как литерал + .
Проблема в том, что в STDOUT отправляются только строки, начинающиеся с [ + ] или [ - ] , а строки, начинающиеся с [ ? ] отправить в STDERR. Только STDOUT получает доступ к grep; STDERR печатается прямо на терминале.
Чтобы получить ожидаемый вывод, выполните следующую команду:
service --status-all 2>&1 | grep '+'
2>&1 отправляет STDERR в STDOUT, поэтому grep может его отфильтровать.
Поскольку вы печатаете только строки, начинающиеся с [ + ] , вы также можете отфильтровать эту часть. Для этого вы можете использовать ключ -o для печати только совпадающих выходных данных, ключ -P для включения регулярных выражений, совместимых с Perl (PCRE), и утверждение для проверки ((?<=...)):
service --status-all 2>&1 | grep -Po '(?<= \[\ \+ \] ).*'
Обратите внимание, что с помощью PCRE вы должны экранировать знак плюс и скобки с обратной косой чертой.
Тот же результат может быть достигнут с помощью BRE, не обращая внимания и не зная точного количества пробелов, если вы используете sed:
service --status-all 2>&1 | grep '+' | sed 's/.*] *//'
Здесь BRE .*] * (Все, вплоть до правой скобки, за которым следует любое количество пробелов), заменяется пустой строкой.