Por que esse comando grep não funciona?

23

Quando tento usar o grep dessa maneira:

service --status-all | grep network

Ele ainda lista todos os serviços, mesmo que eu tenha colocado em grep para restringi-lo somente à string "network"

  

Após o fato:

     

Percebeu esse artigo isso explica porque o comando se comporta dessa maneira, é disso que eu gosto no linux, sempre tem um bom motivo, mas não é necessário intuitivo

    
por Meer Borg 11.03.2013 / 10:38

2 respostas

40

Tente:

service --status-all |& grep network

Os aplicativos de linha de comando podem imprimir em dois fluxos de texto conhecidos como saída padrão (stdout) e erro padrão (stderr). Por padrão, o terminal apenas exibe a saída para ambos de forma idêntica.

Stdout recebe o número 1 e stderr recebe o número 2. Por padrão, os operadores de redirecionamento, como > , | e < aplicam-se apenas ao stdout, número 1.

|& canaliza stdout e stderr juntos para o processo no fluxo de entrada padrão (stdin) da direita, o que torna grep funcionando conforme o esperado.

Eu não sei por que service --status-all está imprimindo para stderr aqui, mas em geral, ter um stderr separado é muito útil, pois permite que você veja erros mesmo quando o stdout é silenciado.

    
por Flimm 11.03.2013 / 10:43
4

Você precisa redirecionar o fluxo de erros padrão ( 2 ) para standard output ( 1 ):

service --status-all 2>&1 | grep network

O operador > normalmente redireciona para o arquivo (por exemplo, 2>/tmp/file ). Para redirecionar para outro fluxo usando o descritor , ele precisa ser precedido com & (note que não há espaços entre os caracteres). / p>     

por Paweł Nadolski 14.03.2013 / 21:44

Tags