背景

背景

背景

我正在运行 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此目的,但我不想计算输入包含的行数来准确计算出我想要显示的行数。

我正在寻找类似headortail但倒置的东西(而不是显示仅有的它显示的流的第一/最后部分一切,但流的开始/结束)。

笔记

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

答案1

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

如果您已经在使用awk,则无需通过额外的过程来删除第一行(记录):只需在记录号上添加一个条件NR

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

既然您提到了headtail,在这种情况下您可能想要的公式是tail -n +2

答案2

当我写这个问题时,我想出了一个使用的解决方案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

相关内容