命令删除输入中的前N行


11

背景

我正在运行SSH服务器,并且要删除此用户。我无法删除此用户,因为他当前正在运行一些我首先需要杀死的进程。

这是我当前正在使用的管道,以找出我当前正在使用的用户的所有进程ID:

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它,但是我不想计算输入中包含多少行来准确地确定要显示的行数。

我正在寻找类似headtail反转的内容(而不是显示流的第一部分/最后一部分,而是显示流的开始/结束以外的所有内容)。

注意

我设法通过简单地| grep [[:digit:]]awk命令后添加来解决此问题,但是我仍在寻找删除文件第一行的方法,因为我认为在其他情况下这将非常有用。


由于您已经在使用awk,因此可以使用NReg 排除标题记录(行)awk 'NR>1 {print $1;}'。更好的选择-使用pgrep -u或使用pkill -u
钢螺丝刀

@steeldriver有趣!给出答案并解释它(awk命令)如何工作。
wefwefa3 2015年

Answers:


14

注意:如果您的系统已经有pgrep/,pkill那么您将在此处重新发明轮子。如果您的系统没有这些实用程序,那么您应该能够格式化输出ps以直接获取未占用的PID列表,例如ps -u user -opid=

如果您已经在使用awk,则不需要通过其他过程来删除第一行(记录):只需在记录编号上添加一个条件NR

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

由于您提到了headtail,因此在这种情况下可能需要的公式是tail -n +2


4
tail -n +2正是我想要的!
wefwefa3 2015年

+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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.