删除输入中前 N 行的命令

wef*_*fa3 11 command-line sed awk tail head

背景

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

这是我当前使用的管道,用于查找我当前使用的用户的所有进程 ID:

ps -u user | awk '{print $1;}'
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

PID
2121
2122
2124
2125
2369
2370
Run Code Online (Sandbox Code Playgroud)

我想通过管道kill -9来杀死所有进程,这样我就可以像这样删除这个愚蠢的用户:

ps -u user | awk '{print $1;}' | sudo xargs kill -9
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为PID标题:

kill: failed to parse argument: 'PID'
Run Code Online (Sandbox Code Playgroud)

问题

我认为必须有一个简单的 Unix 命令来删除第一行输入。

我知道我可以使用tail它,但我不想计算输入包含多少行来确定我想要显示多少行。

我正在寻找类似head或tail但反转的东西(而不是仅显示流的第一/最后部分,它显示除流的开始/结束之外的所有内容)。

笔记

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

ste*_*ver 14

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

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

ps -u user | awk 'NR>1{print $1;}'
Run Code Online (Sandbox Code Playgroud)

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

  • `tail -n +2` 正是我想要的! (4认同)

wef*_*fa3 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
Run Code Online (Sandbox Code Playgroud)