Como usar o awk junto com um comando para mostrar o ID do processo com o comando 'ps' [closed]

5

Eu posso mostrar a PID (segunda coluna) com o comando abaixo:

ps -ef | grep runner | awk {'print$2'}
2432
6346
6348
6350
6352
7407
7410
7416
10824
17305
17494
29658

Mas, em vez disso, quero mostrar pwdx <PID> e também COMMAND (8ª coluna).

Como posso fazer isso?

    
por Chirag Patel 19.10.2011 / 04:52

6 respostas

8

Em vez de usar o awk para filtrar a saída do ps, use a opção ps -o para obter o que você deseja:

ps -e -o pid,comm

Isso deve fazer o que você descreve acima. Veja a página man ps para mais coisas para imprimir.

UPDATE: vejo que não usei pwdx . Experimente isso por tamanho:

#!/bin/bash
ps -o pid= -o comm= |
while read LINE
do
    eval $(echo $LINE |
    awk '{pid=$1; comm=$2; printf "echo -n \"%s  \"; pwdx %s\n", comm, pid}' )
done

Pode ser necessário adicionar sinalizadores a ps para obter os processos que você deseja. O acima apenas mostra os processos do seu ID de usuário.

    
por 19.10.2011 / 05:06
3

Se você quiser imprimir as colunas 2 e 8, adicione apenas $ 8 na impressão.

ps -ef | grep runner | awk {'print $2" "$8'}
    
por 19.10.2011 / 09:16
1

Veja como eu faria:

pwdx $(ps -ef | grep runner | awk {'print$2'})

sintaxe alternativa:

pwdx 'ps -ef | grep runner | awk {'print$2'}'
    
por 19.10.2011 / 10:29
0

Os dois seguintes funcionam para mim:

ps -ef | grep runner | awk {'print$2'} | xargs pwdx

e

ps -ef | grep runner | for i in 'awk {'print$2'}'; do pwdx $i; done

FYI, você receberá uma que se pareça com: 3516: No such process , que corresponderá ao seu grep runner que será concluído no momento em que pwdx for chamado. (Além disso, para qualquer pessoa que use o OS X, pwdx não está na instalação padrão.)

EDIT: Acabei de perceber que você queria devolver COMMAND também. Isso mostrará todos os três em uma linha para cada processo correspondente a runner :

ps -ef | grep runner | for i in 'awk {'print$2'}'; do echo 'ps -e -o pid,comm | grep $i' 'pwdx $i | awk {'print$2'}'; done
    
por 19.10.2011 / 05:09
0
pwdx $(pgrep -f runner)|tr -d : > /tmp/1
pgrep -fl runner > /tmp/2
join /tmp/[12]
    
por 19.10.2011 / 08:51
0
ps -e -o pid,comm | 
while read pid cmd; do 
  printf "%s %s %s\n" $pid $cmd "$(pwdx $pid| cut -d " " -f 2-)"
done

Você pode obter alguns diretórios "Nenhum tal processo" se o processo terminar antes que o pwdx seja invocado para ele.

    
por 19.10.2011 / 16:03

Tags