Listar serviços em execução

2

Estou tentando obter uma lista dos serviços em execução. Eu corri

service --status-all

Ele retornará algo como

 [ + ]  acpid
 [ ? ]  alsa-utils
 [ + ]  apache2
 [ + ]  atd
 [ + ]  avahi-daemon
 [ ? ]  binfmt-support
 [ + ]  bluetooth
 [ - ]  bootlogd
 [ - ]  bootlogs

Eu tento o grep e ele tenta trabalhar com os caracteres especiais.

sudo service --status-all | grep '+'

Existe algo que eu possa fazer para que funcione corretamente?

    
por WojonsTech 17.01.2013 / 02:43

1 resposta

6

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.

    
por 17.01.2013 / 03:07

Tags