Bash: expressão regular do Grep não funciona

0

Ao usar grep da seguinte forma:

ps aux | grep 'processname' | awk '{print $2}'

O PIDs de processos com processname é retornado. Ao usar isso:

ps aux | grep '^processname' | awk '{print $2}'

Estou tentando obter processos cuja linha de comando começa com processname , mas não funciona.

Exemplos de processos em execução:

processname
other_processname

Gostaria de obter o PID da primeira opção, porque processname é o início do comando.

Eu também tentei usar os -E, -e, -w flags, e todos eles retornam o mesmo resultado. O que está incorreto?

    
por hexacyanide 28.02.2013 / 03:31

1 resposta

4

^ marca o início de uma linha, não um campo.

ps aux | grep ' processname'

se aproximará, mas ainda pode dar alguns falsos positivos.

Como a largura das outras colunas é fixa, você também pode usar

grep '^.\{65\}processname'

Aqui, ^.\{65\} tem exatamente 65 caracteres desde o início da linha. O número exato pode variar no seu sistema.

Como você já está usando o awk, essa provavelmente seria a melhor opção:

ps aux | awk '{ if ($11 == "processname") print $2 }'

Você também pode reformatar a saída do ps para tornar o grepping mais fácil:

ps ax -o pid,args | grep '^[^ ]\+ processname'

O comutador -o pid,args faz ps exibir somente o PID e o comando com argumentos. A expressão ^[^ ]\+ corresponde a todos os caracteres desde o início da linha até o primeiro espaço.

    
por 28.02.2013 / 03:36

Tags