Frage Wie greps ps Ausgabe mit Kopfzeilen


Wie kann ich die PS-Ausgabe mit den Kopfzeilen grep?

Diese beiden Prozesse bilden eine App, die auf meinem Server läuft ....

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

tut 6-22:01:17 bedeutet, dass es seit 6 Tagen läuft? Ich versuche herauszufinden, wie lange der Prozess läuft ...

Ist die 2. Spalte die Prozess-ID? Also wenn ich es tue kill 32017 Es wird den 2. Prozess töten?


19
2018-05-11 20:28


Ursprung




Antworten:


ps -ef | egrep "GMC|PID"

Ersetzen Sie die "GMC" und ps schaltet nach Bedarf um.

Beispielausgabe:

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

28
2018-05-11 22:32



Es wäre gut, ein paar Informationen darüber hinzuzufügen, warum das funktioniert. - Elijah Lynn
Nein, das ist eine Übung für den Benutzer. - Hyppy
@ElijahLynn Es passt Text in der Kopfzeile - in diesem Fall PID. Aber Sie könnten es für UID, PTIME oder irgendetwas anderes in der Kopfzeile austauschen ... - Ben Creasy
So ps -e wählt alle Prozesse aus und ps -f ist eine Vollformat-Auflistung, die die Spaltenüberschriften anzeigt. Dann pumpen wir die Spaltenüberschriften und geben sie an egrep aus, was grep erweitert und die Pipe erlaubt | eine besondere Bedeutung haben, nämlich OR (dieses ODER das). Sie stimmen also mit der PID in den Spaltenüberschriften und den wichtigen Ausgangszeilen überein. - Elijah Lynn
Ich musste einfache Anführungszeichen im Befehl egrep / grep -E in Ubuntu 16.04 verwenden, z. B .: ps -ef | grep -E 'GMC|PID' - Vlax


Dank Geekosaur möchte ich diesen Befehl für Ihre Anforderungen verwenden, anstatt einen getrennten Befehl:

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

Das Schwierige ist es, das ";" unterstützt von der Shell, um den Befehl zu verketten.


12
2018-06-26 08:16



das ist sauberer und robuster als die angenommene Antwort. Es stellt nicht fest, dass der Header eine PID enthält, und fügt der Grep-Zeichenfolge keine Komplexität hinzu. - 7yl4r
oh warte ... du hast die ps -ef wiederholt. noch besser ist es ps -ef | { head -1 ; grep "your-pattern" ; } - 7yl4r
@ 7yl4r hat diese Shell-Fähigkeit nie benutzt. Ich habe deinen verbesserten Befehl versucht, funktioniert perfekt! Habe gelernt, :) - Vic Lau
Erkundige dich über diese Technik, genannt "Gruppierungskommandos", für die Neugier anderer, siehe: gnu.org/software/bash/manual/html_node/Command-Grouping.html - Vic Lau


Zweite Spalte ist die Prozess-ID; 4. ist, wenn der Prozess erstellt wurde (dies ist normalerweise der Zeitpunkt, zu dem Ihr Programm gestartet wurde, aber nicht immer; in Betracht ziehen execve() und Freunde); 6. ist die Menge an CPU-Zeit verbraucht. Es läuft also seit 8 Tagen und verbraucht fast 7 Tage CPU-Zeit, was ich als besorgniserregend bezeichnen würde.

Den Header im selben Aufruf zu erhalten, ist bestenfalls schwierig. Ich würde nur ein separates machen ps | head -1. Sie könnten in Betracht ziehen pseigene Auswahlmethoden oder ähnliches pgrep anstatt grep, die nicht wirklich dafür ausgelegt ist, Header zu übergeben.


6
2018-05-11 20:33



Was ist das? 83 ? - Webnet
Aktuelle Prozesspriorität, die auf der früheren CPU- und E / A-Verwendung und der Benutzer- oder Systemzuweisung basiert nice Wert. Kleinere Nummern haben höhere Priorität. In diesem Fall, grep hat die Priorität 0, weil es bei Lesevorgängen auf der Platte blockiert wurde und zum Schreiben der Ausgabe und PNetTNetServer.bin ist eine große Zahl, weil es seine Zeitscheibe konsistent verbraucht, ohne zu blockieren. (Die Planung ist komplex und die Details hängen vom verwendeten Scheduler ab.) - geekosaur


Die egrep-Lösung ist einfach und nützlich, aber natürlich hängt es von der Überschrift ab, die immer "PID" enthält (eine mehr als vernünftige Annahme) und dieselbe Zeichenfolge, die anderswo nicht auftritt. Ich schätze, das ist genug für Ihre Bedürfnisse, aber falls jemand eine Alternative will, gibt es sed.

Sed lässt dich einfach sagen "drucke die erste Zeile und dann jede Zeile, die das Muster enthält". Zum Beispiel:

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

Hinzufügen /sed -n/d; sed selbst herausfiltern:

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

4
2018-05-12 05:29



/sed -n/d stimmt nicht. Einige vorhandene Befehle haben möglicherweise sed -n, die du drucken wolltest. Trick ist zu benutzen sed -n '1p; /[P]ROCESS_NAME_TO_SEARCH/p'. ;-) Hinweis [] um irgendein Zeichen in der Suchzeichenkette herum. - anishsane


einfachere Alternative: ps -ef | { head -1; grep GMC; }

Ersetzen Sie die Nummer durch die Anzahl der Zeilen, auf denen Ihre Kopfzeile angezeigt wird.


4
2018-01-19 09:47



Ich mag diesen Ansatz, aber der Befehl benötigt am Ende ein weiteres Semikolon. ps -ef | { head -1; grep GMC; }. Auch ich mag es in einer Funktion wie folgt: function pgrep() { ps -ef | { head -1; grep $@; } } - Brett


Sie könnten die PID mit Pgrep bekommen

pgrep PNetTNetServer

und dann ps mit der pid verwenden

ps u 12345

oder kombinieren Sie beide zu einem Befehl

ps u `pgrep PNetTNetServer`

Dies würde nur die gewünschte Zeile anzeigen und die Kopfzeile enthalten.


0
2018-05-12 00:25





Ich habe ein kleines Perl-Programm geschrieben, das drucken wird

  • die erste Zeile und alle übereinstimmenden Zeilen, wenn Übereinstimmungen vorhanden sind, oder
  • nichts, wenn es keine Übereinstimmungen gibt.

Ich benutze es am häufigsten wie ps | 1andre GMC, aber es kann auch Dateiargumente verwenden (jede Datei stellt eine eigene Kopfzeile für Übereinstimmungen bereit, die mit Zeilen aus dieser Datei erstellt wurden).

In der Tat

#!/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;
}

0
2018-05-12 07:12