Wie kann der Befehl ps den Speicher in mb anstelle von kb anzeigen lassen?

10

Der Linux-Befehl ps zeigt verschiedene Speichernutzungen wie RSS und die Größe standardmäßig in KB an. Gibt es eine Möglichkeit, in mb oder gb zu zeigen, wie es der ls -s --human-readableFall ist?

balki
quelle
1
Die fehlende Erwähnung in man pslegt nahe, dass es keine solche eingebaute Option gibt.
Ulrich Schwarz

Antworten:

19

AFAIK Sie können es nicht einfach durch reinen psBefehl mit Optionen erreichen. Sie können jedoch einige Textverarbeitungsprogramme verwenden, awkum das zu tun, was Sie möchten:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'

Dies ergibt sich aus psund dann für jede Zeile mit Ausnahme der ersten, die die fünfte Spalte, die normalerweise in KB ist, durch MB ersetzt, wobei das M-Suffix hinzugefügt wird.

Sie können es zu einem Alias ​​machen und in einer .bashrc- Datei speichern, damit Sie es mit so etwas wie aufrufen können myps.

Die meisten Leute fragen sich, wie man das Format beibehält oder andere Einheiten und Präzision verwendet.

Für eine einfache Version können Sie den column -tAusgabefilter verwenden:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}' | column -t

Dies erkennt jedoch Leerzeichen in der letzten Spalte nicht korrekt. Leider müssen wir uns mit der Textformatierung befassen und unsere eigene Formatzeichenfolge im printfähnlichen Format vorbereiten .

ps afu | awk 'NR==1 {o=$0; a=match($0,$11);}; NR>1 {o=$0;$5=int(10*$5/1024)/10"M";}{ printf "%-8s %6s %-5s %-5s %9s %9s %-8s %-4s %-6s %-5s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, substr(o, a);}'

Erläuterung:

  • NR==1Bedingung ist nur für die erste Zeile (Header). Wir verwenden die ursprüngliche ps-Ausgabe, um zu bestimmen, wo COMMAND startet:
    • o=$0 speichert die unveränderte gesamte Zeile, damit wir sie später verwenden können
    • a=match($0,$11) findet die Position des 11. Feldes (an der Stelle, an der die COMMAND-Spalte in der ursprünglichen Ausgabe beginnt)
  • NR>1ist für folgende Zeilen (Daten). Wir ändern das 5. Feld:
    • $5=int(10*$5/1024)/10"M" Ändert den Wert in Megabyte mit einer Dezimalstelle und fügt das Suffix "M" hinzu.
    • printf zeigt alle Felder in spaltenartiger Form an:
      • %-10sbedeutet sfür Zeichenfolge, 10für 10 Zeichen breit, -für Linksausrichtung
      • %8sbedeutet sfür Zeichenfolge, 8für 8 Zeichen breit und da keine -Ausgabe dieses Feldes rechtsbündig ist.
    • substr(o, a)Nimmt die Teilzeichenfolge der ursprünglichen Zeile (daher ozuvor gespeichert) ab der Position, adie in der vorherigen Bedingung berechnet wurde, sodass die Befehlsausgabe mit beibehaltenen Leerzeichen angezeigt werden kann.
DevilaN
quelle
3
Geändert für GB und mit 2 Dezimalstellen (zB 1.23GB):ps aux | awk '{$5=int(100 * $5/1024/1024)/100"GB";}{ print;}'
Mahemoff
1
Ist es möglich, dasselbe Ziel zu erreichen und die psFormatierung beizubehalten? Tabs sind komplett entfernt mitawk
Chris
Ich sehe, Sie gießen als int. Ist es möglich, dass es eine Dezimalzahl wie 1,2M hat?
JavaSheriff
Warum fehlen Tabs?
Alex78191
@ Alex78191: Alternativer Befehl zum Formatieren mit tabellenartiger Ausgabe
hinzugefügt