Команда для удаления первых 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команды, но я все еще ищу способ удалить первую строку файла, так как я думаю, что было бы весьма полезно в других сценариях.

wefwefa3
источник
Так как вы уже используете 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

steeldriver
источник
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
wefwefa3
источник