Como grep ps output com cabeçalhos

19

Como posso grep a saída do PS com os cabeçalhos no lugar?

Estes dois processos criam uma aplicação em execução no meu servidor ....

root     17123 16727  0 16:25 pts/6    00:00:00 grep GMC
root     32017     1 83 May03 ?        6-22:01:17 /scripts/GMC/PNetT-5.1-SP1/PNetTNetServer.bin -tempdir /usr/local/GMC/PNetT-5.1-SP1/tmpData -D

o 6-22:01:17 significa que está sendo executado há 6 dias? Estou tentando determinar o tempo de duração do processo ...

A segunda coluna é o id do processo? Então, se eu fizer kill 32017 , vai matar o segundo processo?

    
por Webnet 11.05.2011 / 22:28

7 respostas

28
ps -ef | egrep "GMC|PID"

Substitua as opções "GMC" e ps conforme necessário.

Exemplo de saída:

root@xxxxx:~$ ps -ef | egrep "disk|PID"

UID        PID  PPID  C STIME TTY          TIME CMD
paremh1  12501 12466  0 18:31 pts/1    00:00:00 egrep disk|PID
root     14936     1  0 Apr26 ?        00:02:11 /usr/lib/udisks/udisks-daemon
root     14937 14936  0 Apr26 ?        00:00:03 udisks-daemon: not polling any devices
    
por 12.05.2011 / 00:32
12

Graças ao geekosaur, eu gostaria de usar este comando para suas demandas, ao invés de um comando separado:

ps -ef | head -1; ps -ef | grep "your-pattern-goes-here"

O complicado é fazer uso do ";" suportado pelo shell para encadear o comando.

    
por 26.06.2014 / 10:16
6

Segunda coluna é o id do processo; A quarta é quando o processo foi criado (geralmente é o tempo que o seu programa começou, mas nem sempre; considere execve() e amigos); 6 é a quantidade de tempo de CPU consumido. Então, ele está funcionando há 8 dias e usou quase 7 dias de tempo de CPU, o que eu consideraria preocupante.

Obter o cabeçalho na mesma invocação é, na melhor das hipóteses, complicado; Eu apenas faria um ps | head -1 separado. Você pode considerar usar os próprios métodos de seleção de ps ou algo parecido com pgrep em vez de grep , o que não é realmente projetado para passar cabeçalhos.

    
por 11.05.2011 / 22:33
4

A solução egrep é simples e útil, mas é claro que você depende do cabeçalho contendo sempre 'PID' (uma suposição mais do que razoável) e a mesma string não está ocorrendo em outro lugar. Eu estou supondo que isso é suficiente para suas necessidades, mas no caso de alguém querer uma alternativa, há sed.

Sed permite que você apenas diga "imprima a primeira linha, depois qualquer linha que contenha o padrão". Por exemplo:

ps auxwww | sed -n '1p; /PROCESS_NAME_TO_SEARCH/p;'

Adicione /sed -n/d; para filtrar o sed para fora:

ps auxwww | sed -n '1p; /sed -n/d; /PROCESS_NAME_TO_SEARCH/p;'
    
por 12.05.2011 / 07:29
4

alternativa mais fácil: ps -ef | { head -1; grep GMC; }

substitua o número pelo número de linhas em que seu cabeçalho é exibido.

    
por 19.01.2016 / 10:47
0

você pode pegar o pid com o pgrep

pgrep PNetTNetServer

e depois use ps com o pid

ps u 12345

ou até mesmo combinar os dois em um comando

ps u 'pgrep PNetTNetServer'

Isso mostraria apenas a linha desejada e incluiria o cabeçalho.

    
por 12.05.2011 / 02:25
0

Eu escrevi um pequeno programa Perl que irá imprimir

  • a primeira linha e todas as linhas correspondentes, se houver alguma correspondência, ou
  • nada, se não houver correspondências.

Na maioria das vezes, uso como ps | 1andre GMC , mas ele também pode receber argumentos de arquivo (cada arquivo fornece sua própria linha de cabeçalho para correspondências feitas em linhas desse arquivo).

#!/usr/bin/perl

#
# 1andre <regexp> [<file> ...]
#
#   1 -           first ({1}st)
# and -                  {and}
#  re - (lines matching) {re}gexp
#
# If no <files> are given (or "-" is given as a <file>) stdin is
# used.
#
# If any lines from each <file> match the <regexp>, print the
# first line from that <file> and all the matching lines from
# that <file>.
#

use strict;
use warnings;

if(scalar @ARGV < 1) {
  printf STDERR "usage: %s <regexp> [<file> ...]\n", $0;
  exit 1;
}

my $re = shift;
my $header;

while(<>) {
  if($. == 1) {
    $header = $_;
  } elsif(m/$re/) {
    if(defined $header) {
      print $header;
      undef $header;
    }
    print;
  }
} continue {
  # close resets $. when we get to the end of each file that <> is processing
  close ARGV if eof;
}
    
por 12.05.2011 / 09:12

Tags