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.