kill命令在awk中不起作用

时间:2015-12-12 05:34:36

标签: linux macos bash shell awk

有一个unix shell命令,如下所示:

lsof -i:8888 | awk ' $2 ~ /^[0-9]+$/ { print $2;kill -9 $2 } '

它可以打印我想要正确杀死的pid,但是kill命令并没有杀死这个pid的进程,但如果我运行它会separtely它会工作,即: 首先,运行

lsof -i:8888 | awk ' $2 ~ /^[0-9]+$/ { print $2} '
找到我要杀的pid 然后,运行

kill <pid>#pid is get from last command

然后该过程将被正确杀死,

我在Mac上运行,任何人都可以告诉我为什么会发生这种情况以及如何解决它,谢谢!

5 个答案:

答案 0 :(得分:1)

kill $(lsof -i:8888 | awk ' $2 ~ /^[0-9]+$/ {print $2}')

答案 1 :(得分:0)

kill中没有awk命令,您需要使用不同的方法,更简单的是调用shell kill命令。

如果您真的想从awk内部进行此操作,这可能仍然不是最佳方式:

lsof -i:8888 | awk '
    $2 ~ /^[0-9]+$/ {
        print $2
        command=sprintf("kill -9 %d",$2)
        system(command)
        close(command)
} '

注1:回复注释只能执行awk支持的命令,其他命令会被忽略?

是的,作为awk处理其指令的方式的副作用,如果与您一样使用shell语法,则awk中可能确实会忽略大多数其他“命令”。使用awk语法kill(-9,$2)会触发错误,但kill -9 $2不会。 可能所有awk实现都不将未定义的标记视为语法错误。他们只是将它转换为它作为变量的值,这里是一个空字符串或0,并将参数连接到它,如果有的话。有些情况下,这可能会导致错误,例如在参数中出现awk内置命令时,其中命令名称具有由点(例如command.sh)引入的后缀,使其成为无效的变量名称,或者如果给出了完整路径,这可能会引发令人费解的错误消息,如下面的测试:

这个awk脚本:

BEGIN {
    /usr/bin/kill -9 9999
}

将导致这些消息,具体取决于所使用的awk实现:

Legacy awk(原来的旧实现)

awk: syntax error near line 2
awk: illegal statement near line 2

标准awk(a.k.a。nawk)

nawk: division by zero
 source line number 2

GNU awk(a.k.a。gawk)

gawk: test:2: fatal: division by zero attempted
迈克的笨蛋(a.k.a. mawk)

* No error reported, no output

Busybox awk

awk: test:2: Division by zero

注意2:在你的情况下,虽然它会起作用,但使用我描述的方法并不是很有意义。这就是为什么我写“你真的想从awk 中做到这一点”。

然而,肯定会有更复杂的情况system()awk非常有用,虽然本质上很危险,就像使用其他几种编程语言一样。

答案 2 :(得分:0)

lsof -i:8888 | awk ' $2 ~ /^[0-9]+$/ { print $2} ' | xargs kill

kill写在awk'{}'中时,它不会在shell上执行而是由awk执行。

答案 3 :(得分:0)

lsof -i:8888 | awk ' $2 ~ /^[0-9]+$/ { print $2 } '|xargs kill -9

要在命令中执行awk输出,您需要将awk输出传递给xargs命令。

答案 4 :(得分:0)

此构造可在MacOS(和Linux)上运行

function saveData() {
  var sheetinput = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = sheetinput.getSheets()[0];
  //var sheetoutput = SpreadsheetApp.getActiveSpreadsheet(); // This is redundant with the variable sheetinput. Both sheets are in the same spreadsheet, so you can use the same variable for the spreadsheet. I'd suggest changing its name as well to something like 'spreadsheet' instead of 'sheetinput'
  var sheet2 = sheetinput.getSheets()[1];
  //var rows = sheet1.getDataRange().getValues();
  //sheet2.appendRow(rows); 
  var sheet1range = sheet1.getDataRange();
  sheet2.getRange(sheet2.getLastRow()+1, 1, sheet1range.getNumRows(), sheet1range.getNumColumns()).setValues(sheet1range.getValues());
} 

因为lsof -i:8888 | awk ' $2 ~ /^[0-9]+$/ { print $2; "/bin/kill -9 " $2 | getline resp } ' 之前的字符串被解释为命令。