tło
Korzystam z serwera SSH i mam tego użytkownika, którego chcę usunąć. Nie mogę usunąć tego użytkownika, ponieważ obecnie uruchomił kilka procesów, które muszę najpierw zabić.
Jest to potok, którego używam obecnie, aby znaleźć wszystkie identyfikatory procesów użytkownika, którego aktualnie używam:
ps -u user | awk '{print $1;}'
Dane wyjściowe wyglądają następująco:
PID
2121
2122
2124
2125
2369
2370
Chcę to potokować, kill -9
aby zabić wszystkie procesy, aby móc usunąć tego głupiego użytkownika w następujący sposób:
ps -u user | awk '{print $1;}' | sudo xargs kill -9
Ale to nie działa z powodu PID
nagłówka:
kill: failed to parse argument: 'PID'
Pytanie
Myślę, że aby usunąć pierwszy wiersz danych wejściowych, musi istnieć proste polecenie uniksowe.
Wiem, że mogę to wykorzystać, tail
ale nie chcę liczyć, ile wierszy zawiera dane wejściowe, aby dowiedzieć się dokładnie, ile chcę wyświetlić.
Szukam czegoś podobnego head
lub tail
odwróconego (zamiast wyświetlać tylko pierwszą / ostatnią część strumienia wyświetla wszystko oprócz początku / końca strumienia).
Uwaga
Udało mi się rozwiązać ten problem miałem po prostu dodając | grep [[:digit:]]
po moim awk
dowództwem, ale ja wciąż szuka sposobu, aby usunąć pierwszy wiersz pliku, jak myślę, byłoby bardzo przydatne w innych scenariuszach.
NR
npawk 'NR>1 {print $1;}'
. Jeszcze lepiej - użyjpgrep -u
lubpkill -u
awk
polecenie).Odpowiedzi:
UWAGA: jeśli twój system już ma
pgrep
/pkill
to ponownie wymyślasz koło tutaj. Jeśli twój system nie ma tych narzędzi, powinieneś być w stanie sformatować dane wyjściowe,ps
aby uzyskać nieobciążoną listę PID bezpośrednio, np.ps -u user -opid=
Jeśli już używasz
awk
, nie ma potrzeby przeprowadzania dodatkowego procesu w celu usunięcia pierwszego wiersza (rekordu): po prostu dodaj warunek do numeru rekorduNR
Ponieważ wspomniałeś
head
itail
formuła, którą prawdopodobnie chcesz w tym przypadku jesttail -n +2
źródło
tail -n +2
było dokładnie tym, czego szukałem!ps
aby nie drukować nagłówka-opid=
, ponieważ zapobiega to pojawianiu się wyników. Jeśli przyszły użytkownik kiedykolwiek zdecyduje się posortować daneps
wyjściowe na środku potoku, założenie awk / sed / tail może się nie powieść.Pisząc to pytanie, wymyśliłem rozwiązanie
sed
.Usuń jeden wiersz na początku wprowadzania
Aby usunąć jedną linię, użyj
sed 1d
.Usuń wiele wierszy na początku wprowadzania
Aby usunąć
N
liczbę linii, użyjsed 1,Nd
Aby usunąć pierwsze 5 wierszy, użyj
sed 1,5d
Aby usunąć pierwsze 10 wierszy, użyj
sed 1,10d
Aby usunąć pierwsze 25 wierszy, użyj
sed 1,25d
Rurociąg
Rurociąg staje się więc w scenariuszu:
źródło