Filtrando e extraindo os PIDs como uma lista separada por espaços do ps usando sed

2

Eu quero filtrar e formatar a saída de ps -ax -o pid,command , mas não tenho certeza de qual canal usar para ela.

Eu quero filtrar as linhas que correspondem a uma string fixa em uma posição fixa, basta manter os pids para as linhas combinadas e gerá-las como uma lista separada por espaços, como 1234 5678 33121 .

Eu posso trivialmente fazer o primeiro passo usando | egrep 'regex' , mas o segundo passo provavelmente precisa de sed ou algo assim, e eu não consigo resolver isso. Como sed (e awk) também lida com a filtragem de regex, eu provavelmente não preciso de grep.

Vários caracteres de espaço são bons e a ordem de classificação não é importante, portanto, não há necessidade de aparar os PIDs ou de solicitar as linhas. Exemplo:

$ ps -ax -o pid,command

  PID COMMAND
    0 [kernel]
    1 /sbin/init --
...
  255 /usr/local/sbin/check_status
  268 /sbin/devd -q
 1435 (unlinkd) (unlinkd)
 1974 sleep 60
 7414 /bin/sh /var/db/test/update.sh
21848 ps -ax -o pid,command
39207 /usr/local/sbin/syslog-ng -p /var/run/syslog-ng.pid

encontre todos os processos cujo comando começa com / usr / (isto é, linhas matching /usr/ in chars 7-11 ou regex ^[0-9 ]{5}\s\/usr\/ ) e retorne seus pids (ou first 5 chars ) em uma única linha separada por espaço. Saída:

255 39207   (no \n's, amount of spacing unimportant).

Eu tentei, mas sed não é o comando mais fácil de descobrir. Como faço isso?

    
por Stilez 29.08.2015 / 02:13

1 resposta

3

Se você estiver disposto a pegar todos os dígitos do pid você pode usar pgrep para fazer isso para você:

pgrep -d " " -f ^/usr

imprimirá uma lista separada por espaços de todos os PIDs dos processos cujo comando começa com /usr

Se você realmente quiser usar o comando ps , awk seria uma ferramenta melhor do que sed para fazer o que você deseja. Você poderia fazer isso, com apenas os 5 primeiros caracteres do PID:

ps -ax -o pid,command | awk '$2 ~ /^\/usr/ {printf( "%s ", substr($1,0,5));} END {print ""}'

Isto irá verificar se o segundo campo começa com /usr e, se assim for, imprimir até os primeiros 5 caracteres do primeiro campo seguido por um espaço, então eu joguei uma nova linha no final para uma boa medida, mas você poderia remover isso se você não quiser uma nova linha, mesmo no final

Como Giles apontou, você provavelmente nunca vai realmente querer apenas os 5 primeiros caracteres de um PID (que provavelmente me interpretou mal a pergunta), então a resposta mais útil usando awk seria:

ps -ax -o pid,command | awk '$2 ~ /^\/usr/ {printf( "%d ", $1);} END {print ""}'
    
por 29.08.2015 / 02:22