I try to grep and it tries to work with the special characters.
Com expressões regulares básicas (BRE) ativadas (o padrão na ausência das opções -E , -F ou -P ), o grep interpreta o caractere mais como um literal + .
O problema é que apenas as linhas que começam com [ + ] ou [ - ] são enviadas para STDOUT , enquanto as linhas que começam com [ ? ] são enviadas para STDERR . Apenas o STDOUT é enviado ao grep; STDERR é impresso diretamente no terminal.
Para obter a saída esperada, execute o seguinte comando:
service --status-all 2>&1 | grep '+'
2>&1 envia STDERR para STDOUT, então o grep é capaz de filtrá-lo.
Como você está imprimindo apenas linhas que começam com [ + ] , é melhor filtrar essa parte. Para fazer isso, você pode usar a opção -o para imprimir apenas a saída correspondente, a opção -P para ativar Expressões regulares compatíveis com Perl (PCRE) e uma asserção de look-behind ( (?<=...) ):
service --status-all 2>&1 | grep -Po '(?<= \[\ \+ \] ).*'
Observe que, com o PCRE, você precisa escapar do sinal de mais e dos colchetes com uma barra invertida.
O mesmo resultado pode ser obtido com BRE, sem look-behind e sem saber o número exato de espaços se você usar sed :
service --status-all 2>&1 | grep '+' | sed 's/.*] *//'
Aqui, o BRE .*] * (até o colchete direito, seguido por qualquer número de espaços) é substituído pela string vazia.