Bash: Expressão regular Grep não funciona

Bash: Expressão regular Grep não funciona

Ao usar grepassim:

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

O PIDsdos processos com processnameé retornado. Ao usar isso:

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

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

Exemplos de processos em execução:

processname
other_processname

Gostaria de pegar PIDa primeira opção, pois processnameé o início do comando.

Também tentei usar os -E, -e, -wsinalizadores e todos retornaram o mesmo resultado. O que há de incorreto?

Responder1

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

ps aux | grep ' processname'

chegará mais perto, mas ainda poderá dar alguns falsos positivos.

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

grep '^.\{65\}processname'

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

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

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

Você também pode reformatar a saída do ps para facilitar o grep:

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

A opção -o pid,argsfaz com que ps exiba apenas 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.

informação relacionada