如何在 shell 脚本中使用 awk 的位置参数



我使用以下代码段突然终止任何正在运行的java进程:

ps -ef | grep java | grep -v grep | awk "{print $2}" | xargs kill -9

我想把它放在一个可以在多台机器上运行的shell脚本中,但当我把它放进脚本并运行时,它会把awk中的$2作为传入参数。我尝试过对$进行单反斜杠、双反斜杠和三反斜杠,但都不起作用。

单次转义导致:

can't read "2": no such variable

双重转义导致:

awk: cmd. line:1 {print
awk: cmd. line:1:      ^ unexpected newline or end of string

三次转义导致:

awk: cmd. line:1 {print
awk: cmd. line:1:      ^ unexpected newline or end of string

因此,我正在寻找一种方法,将awk使用的$arguments传递到shell脚本中

你能试一下以下内容吗(灵感来自@James fine的回答(。

ps -ef | awk '/[j]ava/{cmd=(cmd?cmd OFS:"")$2} END{print "kill -9 " cmd}'

这将只打印kill命令,一旦您对它的结果(pid数字等(感到满意,然后运行以下命令来实际杀死pid。

ps -ef | awk '/[j]ava/{cmd=(cmd?cmd OFS:"")$2} END{print "kill -9 " cmd}' | bash

怎么样:

$ ps -ef | awk '/[j]ava/{print $2}'

样本输出:

28510

有一个命令可以做到这一点:

pkill java

pkill接受-signal(例如-9(表示法,就像kill一样,但我建议从较弱的信号开始,为终止的进程提供适当关闭的时间。我通常做-HUP(挂断,-1(,然后做标准(没有终止标志,-TERM-15(,然后再做-9(终止,-KILL(。

如果你想在运行它之前知道它会做什么,你可以用列出匹配的进程ID

pgrep java

或了解更多详细信息:

pgrep -a java

(或pgrep java |xargs ps -f,如果您喜欢(

最新更新