如何在bash stdout中将多行转换为一行?

时间:2010-02-08 19:30:29

标签: bash shell

我有时会在我的shell中这样做:

sam@sam-laptop:~/shell$ ps aux | grep firefox | awk '{print $2}'
2681
2685
2689
4645

$ kill -9 2681 2685 2689 4645

有没有办法可以将包含PID的多行转换为由空格分隔的一行? (每次输入PID都有点烦人,我真的想学习:))

非常感谢。

6 个答案:

答案 0 :(得分:11)

这方面的简单方法是使用xargs

ps aux | grep firefox | awk '{print $2}' | xargs kill -9

这将同时调用带有所有pid的kill命令。 (正是你想要的)

答案 1 :(得分:6)

    killall -9 firefox 

答案 2 :(得分:2)

pids=""
for pid in $(ps aux | grep firefox | awk '{print $2}')
do
pids=" $pid"
done
kill -9 $pids

答案 3 :(得分:2)

请改用pkill。还有一个pgrep。

这会做你想要的,你能得到多少简单?

pkill firefox

使用-9选项进行pkill将是您目前所做的事情;但是,避免使用SIGKILL:

  

请勿轻易使用此信号。这个过程没有任何机会清理。它可能会留下孤立的子进程,临时文件,分配的锁,活动的共享内存段,繁忙的套接字以及任何数量的其他资源状态不一致。这可能导致在系统的后续操作中出现令人惊讶且难以调试的问题。 [wlug.org]

  

顺便说一下,这是你不应该经常使用的一个原因   SIGKILL。 SIGKILL只应在进程使用时使用   挂着,不能以任何其他方式杀死。如果你使用   python脚本中的SIGTERM或SIGINT,你会看到   mplayer将使终端处于USABLE状态。如果你   经常使用SIGKILL程序没有机会   清理任何东西,可能会对你的整体造成不利影响   在某些情况下系统。

     

SIGTERM是kill shell命令发送的默认信号。   SIGINT是从终端中断(control-C)发送的信号。 [debian.org]

答案 4 :(得分:2)

你可以用awk

来做
ps -eo pid,args | awk 'BEGIN{s="kill -9 "}$2~/bash/{s=s" "$1} END{system(s)}'

答案 5 :(得分:2)

我同意关于使用pkill的所有其他回复,但是,...而不是使用xargs,...您可以将其传递给tr

kill $(ps aux | grep [f]irefox | awk '{print $2}' | tr '\n' ' ')

另外,请考虑使用[f],以便与grep进程本身不匹配。