Befehl zum Entfernen der ersten N Zeilen in der Eingabe

11

Hintergrund

Ich verwende einen SSH-Server und habe diesen Benutzer, den ich löschen möchte. Ich kann diesen Benutzer nicht löschen, da er derzeit einige Prozesse ausführt, die ich zuerst beenden muss.

Dies ist die Pipeline, die ich derzeit verwende, um alle Prozess-IDs des Benutzers herauszufinden, den ich derzeit verwende:

ps -u user | awk '{print $1;}'

Die Ausgabe sieht folgendermaßen aus:

PID
2121
2122
2124
2125
2369
2370

Ich möchte dies weiterleiten kill -9, um alle Prozesse abzubrechen, damit ich diesen dummen Benutzer wie folgt löschen kann:

ps -u user | awk '{print $1;}' | sudo xargs kill -9

Dies funktioniert aber aufgrund des PIDHeaders nicht:

kill: failed to parse argument: 'PID'

Die Frage

Ich denke, dass es einen einfachen Unix-Befehl geben muss, um die erste Eingabezeile zu entfernen.

Mir ist bewusst, dass ich dies verwenden kann, tailaber ich möchte nicht zählen, wie viele Zeilen die Eingabe enthält, um genau herauszufinden, wie viele ich anzeigen möchte.

Ich suche etwas wie headoder tailaber invertiert (anstatt nur den ersten / letzten Teil des Streams anzuzeigen , wird alles außer dem Anfang / Ende des Streams angezeigt ).

Hinweis

Es gelang mir, dieses Problem zu lösen, indem ich es einfach | grep [[:digit:]]nach meinem awkBefehl hinzufügte, aber ich suche immer noch nach einer Möglichkeit, die erste Zeile einer Datei zu löschen, da ich denke, dass dies in anderen Szenarien sehr nützlich wäre.

wefwefa3
quelle
Da Sie awk bereits verwenden, können Sie den Header-Datensatz (Zeile) mit NRz awk 'NR>1 {print $1;}'. Besser noch - benutze pgrep -uoderpkill -u
steeldriver 31.12.15
@steeldriver Interessant! Machen Sie eine Antwort und erklären Sie, wie es (der awkBefehl) funktioniert.
Wefwefa3

Antworten:

14

HINWEIS: Wenn Ihr System bereits über pgrep/ verfügt, pkillerfinden Sie das Rad hier neu. Wenn Ihr System nicht über diese Dienstprogramme verfügt, sollten Sie in der Lage sein, die Ausgabe von pszu formatieren , um die unbelegte PID-Liste direkt abzurufen, zps -u user -opid=

Wenn Sie bereits verwenden awk, müssen Sie keinen zusätzlichen Prozess durchlaufen, um die erste Zeile (Datensatz) zu entfernen. Fügen Sie einfach eine Bedingung für die Datensatznummer hinzuNR

ps -u user | awk 'NR>1{print $1;}'

Da Sie headund erwähnen tail, ist die Formel, die Sie wahrscheinlich in diesem Fall wollentail -n +2

Stahlfahrer
quelle
4
tail -n +2war genau das, wonach ich gesucht habe!
Wefwefa3
+1 für die Meldung, dass pskeine Kopfzeile mit gedruckt werden soll -opid=, da dies verhindert, dass die Ausgabe jemals angezeigt wird. Wenn ein zukünftiger Benutzer jemals beschließt, die psAusgabe in der Mitte der Pipeline zu sortieren , kann die Annahme awk / sed / tail abbrechen.
Jeff Schaller
8

Während ich diese Frage schrieb, fand ich eine Lösung mit sed.

Löschen Sie eine Zeile am Anfang der Eingabe

Zum Löschen einer Zeile verwenden Sie sed 1d.

Löschen Sie mehrere Zeilen zu Beginn der Eingabe

Um die NAnzahl der Zeilen zu löschen , verwenden Siesed 1,Nd

  • Zum Löschen der ersten 5 Zeilen verwenden Sie sed 1,5d

  • Zum Löschen der ersten 10 Zeilen verwenden Sie sed 1,10d

  • Zum Löschen der ersten 25 Zeilen verwenden Sie sed 1,25d

Die Pipeline

So wird die Pipeline im Szenario:

ps -u user | awk '{print $1;}' | sed 1d | sudo xargs kill -9
                                     ^ removes the PID header
wefwefa3
quelle