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
在我写这个问题时,我想出了一个使用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)