Procura e imprime as linhas da saída que podem conter linhas com erros

2

Eu tenho um exemplo de comando,

device list

que me fornece todos os dispositivos com seu status como ok ou erro no seguinte formato

[okay     ]:  you are listening on : 11
[error    ]:  not currently listening: 22
[error    ]:  not currently listening: 33
[okay     ]:  you are listening on : 111

Quero imprimir apenas dispositivos com status ok .

Eu tentei usar o comando grep como

device list | grep -r 'okay'
device list | grep -r '[okay     ]'
device list | grep -r '^okay'
device list | grep  'okay'

Mas não imprimiu nenhuma saída. Como posso imprimir os dispositivos com status como ok?

Obrigado antecipadamente.

    
por Prakash V Holkar 24.03.2014 / 12:02

3 respostas

4

Você não precisa usar a opção -r com grep neste caso, porque (veja em man grep ):

-r, --recursive
              Read all files  under  each  directory,  recursively,  following
              symbolic  links  only  if they are on the command line.  This is
              equivalent to the -d recurse option.

Você também precisa redirecionar e erros da saída padrão para serem canalizados pelo comando grep usando 2>&1 redirecionamento:

device list 2>&1 | grep 'okay'

Ou você pode usar |& :

device list |& grep 'okay'
    
por Radu Rădeanu 24.03.2014 / 12:21
2

A partir da saída que nos foi dada, pelo menos a versão do grep deveria ter funcionado. Se isso não acontecer, a única razão possível é porque esse comando não imprime sua saída em STDOUT , mas em STDERR . Ambos são exibidos em qualquer terminal / console por padrão, mas comandos como grep ao obter sua entrada através de um pipe ( | ) fazem isso de STDOUT apenas.

A solução é redirecionar a saída de STDERR para STDOUT , isso é o que o 2>&1 ou |& fará:

$ device list 2>&1 | grep okay
$ device list |& grep okay

As três primeiras formas de comando, usando grep -r , nunca funcionarão, mesmo se você redirecionar a saída de STDERR , porque a opção -r é usada para recursão no diretório e no subdiretório. Assim, mesmo se usado após um pipe, grep -r something pesquisará algo em arquivos em todos os diretórios de onde você executou o comando.

    
por Benoit 24.03.2014 / 12:49
1

Remova a opção -r do seu comando grep e ela funcionará:

device list | grep 'okay'

-r é para pesquisa recursiva.

    
por Sylvain Pineau 24.03.2014 / 12:05