Команда для видалення першого N числа рядків у введенні


11

Фон

Я запускаю SSH-сервер і цього користувача, якого я хочу видалити. Я не можу видалити цього користувача, оскільки він зараз виконує декілька процесів, які мені потрібно вбити в першу чергу.

Це конвеєр, який я зараз використовую, щоб дізнатися всі ідентифікатори процесу користувача, яким я зараз користуюся:

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

Вихід виглядає приблизно так:

PID
2121
2122
2124
2125
2369
2370

Я хочу зробити це, щоб kill -9знищити всі процеси, щоб я міг видалити цього дурного користувача, як це:

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

Але це не працює через PIDзаголовок:

kill: failed to parse argument: 'PID'

Питання

Я думаю, що для видалення першого рядка введення повинна бути проста команда Unix.

Я усвідомлюю, що можу використовувати tailдля цього, але не хочу рахувати, скільки рядків містить вхід, щоб зрозуміти, скільки саме я хочу відобразити.

Я шукаю щось на кшталт headабо tailперевернуте (замість того, щоб відображати лише першу / останню частину потоку, він відображає все, крім початку / кінця потоку).

Примітка

Мені вдалося вирішити цю проблему, просто додавши | grep [[:digit:]]після моєї awkкоманди, але я все ще шукаю спосіб видалити перший рядок файлу, оскільки я думаю, що це було б дуже корисно в інших сценаріях.


Оскільки ви вже використовуєте awk, ви могли виключити запис заголовка (рядка), використовуючи NRнапр awk 'NR>1 {print $1;}'. Ще краще - використовувати pgrep -uабоpkill -u
steeldriver

@steeldriver Цікаво! Складіть відповідь і поясніть, як це ( awkкоманда) працює.
wefwefa3

Відповіді:


14

ПРИМІТКА: якщо у вашій системі вже є pgrep/ pkillтоді ви знову винайдете колесо. Якщо у вашій системі немає цих утиліт, ви маєте змогу форматувати вихід, psщоб безпосередньо отримати неметалізований список PID, наприкладps -u user -opid=

Якщо ви вже використовуєте awk, не потрібно переглядати додатковий процес, щоб видалити перший рядок (запис): просто додайте умову на номер записуNR

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

Оскільки ви згадуєте headта tail, формула, яку ви, мабуть, хочете в цьому випадку, такаtail -n +2


4
tail -n +2було саме те, що я шукав!
wefwefa3

+1 за те, що psне потрібно друкувати заголовок -opid=, оскільки це не дозволяє відображатись. Якщо майбутній користувач коли-небудь вирішить сортувати psвихід у середині трубопроводу, припущення awk / sed / tail може зламатися.
Джефф Шаллер

8

Коли я писав це питання, я вирішив, використовуючи рішення sed.

Видаліть один рядок на початку введення

Щоб видалити один рядок, використовуйте sed 1d.

Видаліть кілька рядків на початку введення

Щоб видалити Nкількість рядків, використовуйтеsed 1,Nd

  • Для видалення перших 5 рядків використовуйте sed 1,5d

  • Для видалення перших 10 рядків використовуйте sed 1,10d

  • Для видалення перших 25 рядків використовуйте sed 1,25d

Трубопровід

Тож конвеєр стає у сценарії:

ps -u user | awk '{print $1;}' | sed 1d | sudo xargs kill -9
                                     ^ removes the PID header
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.