背景
我正在运行 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
此目的,但我不想计算输入包含的行数来准确计算出我想要显示的行数。
我正在寻找类似head
ortail
但倒置的东西(而不是显示仅有的它显示的流的第一/最后部分一切,但流的开始/结束)。
笔记
| grep [[:digit:]]
我设法通过简单地在命令后添加来解决这个问题awk
,但我仍在寻找一种删除文件第一行的方法,因为我认为在其他情况下非常有用。
答案1
注意:如果你的系统已经有pgrep
/pkill
那么你就在这里重新发明轮子。如果您的系统没有这些实用程序,那么您应该能够格式化输出ps
以直接获取不受阻碍的 PID 列表,例如ps -u user -opid=
如果您已经在使用awk
,则无需通过额外的过程来删除第一行(记录):只需在记录号上添加一个条件NR
ps -u user | awk 'NR>1{print $1;}'
既然您提到了head
和tail
,在这种情况下您可能想要的公式是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