Polecenie usunięcia pierwszej N liczby linii na wejściu

11

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 -9aby 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 PIDnagłó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ć, tailale nie chcę liczyć, ile wierszy zawiera dane wejściowe, aby dowiedzieć się dokładnie, ile chcę wyświetlić.

Szukam czegoś podobnego headlub tailodwró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 awkdowództwem, ale ja wciąż szuka sposobu, aby usunąć pierwszy wiersz pliku, jak myślę, byłoby bardzo przydatne w innych scenariuszach.

wefwefa3
źródło
Ponieważ używasz już awk, możesz wykluczyć rekord nagłówka (wiersz), używając NRnp awk 'NR>1 {print $1;}'. Jeszcze lepiej - użyj pgrep -ulubpkill -u
steeldriver
@steeldriver Ciekawe! Udziel odpowiedzi i wyjaśnij, jak to działa ( awkpolecenie).
wefwefa3

Odpowiedzi:

14

UWAGA: jeśli twój system już ma pgrep/ pkillto ponownie wymyślasz koło tutaj. Jeśli twój system nie ma tych narzędzi, powinieneś być w stanie sformatować dane wyjściowe, psaby 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

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

Ponieważ wspomniałeś headi tailformuła, którą prawdopodobnie chcesz w tym przypadku jesttail -n +2

steeldriver
źródło
4
tail -n +2było dokładnie tym, czego szukałem!
wefwefa3
+1 za informowanie, psaby nie drukować nagłówka -opid=, ponieważ zapobiega to pojawianiu się wyników. Jeśli przyszły użytkownik kiedykolwiek zdecyduje się posortować dane pswyjściowe na środku potoku, założenie awk / sed / tail może się nie powieść.
Jeff Schaller
8

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ąć Nliczbę 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:

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