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 PID
Headers 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, tail
aber 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 head
oder tail
aber 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 awk
Befehl 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.
NR
zawk 'NR>1 {print $1;}'
. Besser noch - benutzepgrep -u
oderpkill -u
awk
Befehl) funktioniert.Antworten:
HINWEIS: Wenn Ihr System bereits über
pgrep
/ verfügt,pkill
erfinden Sie das Rad hier neu. Wenn Ihr System nicht über diese Dienstprogramme verfügt, sollten Sie in der Lage sein, die Ausgabe vonps
zu 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
Da Sie
head
und erwähnentail
, ist die Formel, die Sie wahrscheinlich in diesem Fall wollentail -n +2
quelle
tail -n +2
war genau das, wonach ich gesucht habe!ps
keine Kopfzeile mit gedruckt werden soll-opid=
, da dies verhindert, dass die Ausgabe jemals angezeigt wird. Wenn ein zukünftiger Benutzer jemals beschließt, dieps
Ausgabe in der Mitte der Pipeline zu sortieren , kann die Annahme awk / sed / tail abbrechen.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
N
Anzahl 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:
quelle