Bash运算符<,>,| 和grep / kill


3

作为练习,我想使用基本的bash原则通过命令行终止一个进程但是我遇到了一些我不理解的错误:

ps -A | grep nautilus | egrep -o '[0-9]{4,5}' | kill

1)它不起作用

如果我试试

ps -A | grep nautilus | egrep -o '[0-9]{4,5}' > kill

2)也不起作用

3)如果我这不 (..) egrep '\d' (...)应该与[0-9]相同?

4)我有什么方法可以做这样的事情:

kill < (greps (...) )
linux  bash  grep  kill 

为什么要迁移?编程是否相关?
aioobe 2011年

这是迁移的荒谬。Shell脚本绝对与编程相关。
riwalk 2011年

1
首先:( nautilus -q!!); 否则killall namepgrep -fl namepkill -f name
sehe

Answers:


5

尝试

kill `ps -A | grep nautilus | egrep -o '[0-9]{4,5}'`

反引号中的命令将作为命令的一部分执行并输入。


3
...或使用$()而不是反引号,更容易阅读:)
slhck 2011年

4
4-5位的假设很奇怪; 大多数ps实现都没有填充pids的左边,并且pid使用可以回绕。有些操作系统甚至实际使用超过16位的pid空间。
Phil P

3
  1. |操作者馈送到右边的“标准输入”中的“标准输出”(标准输出)从左侧; 标准输入或标准输入,相当于“如果他们输入我的话,我会从用户那里读到的内容”。该kill(1)命令会终止其命令行上提供的进程ID,而不是其stdin上的进程ID。所以xargs之前插入kill会有所帮助:

    ... | xargs kill

    因为xargs(1)它使用stdin并将其批量化为块,以使用由这些块组成的命令行重复调用所提供的命令(此处为“kill”)。

  2. >运算符用于标准输出重定向到一个文件,你已经创建在当前目录中一个新的文件,该文件的文件名为“杀”和PID的内容。

  3. 该模式\d不是“标准”或“扩展”正则表达式语言的一部分; 相反,它是由Perl引入的(我相信),并且在正则表达式语言的许多后来的变体中。用于Perl兼容正则表达式的PCRE提供了一个库,它有助于将扩展语法扩展到许多其他工具和语言,但肯定不是当今唯一的实现。有些网站将为您提供不同正则表达式语言的矩阵比较。

    PCRE随船为您pcregrep(1)理解\d; 另外,现代GNU grep有-P选项,它将使用PCRE进行正则表达式。

  4. 您在这里称为“命令替换”的概念,其中命令的stdout直接在命令行中使用; 现代语法是这样的$(...),虽然你也会看到使用的反引号,`...`但这是历史的,并没有很好地嵌套。所以:

    kill $(ps ... | pcregrep ... | munge)


2

你也可以尝试killall

killall nautilus

(从包中psmisc,至少在debian / ubuntu中)。


1
OP没有陈述他们的操作系统。更好的希望不是SysV,比如Solaris,它killall不会做你认为它做的事情。;)
Phil P


0

我会去xargs

ps -A | grep nautilus | egrep -o '[0-9]{4,5}' | xargs -L 1 kill

实际上,kill接受多个参数,因此-L 1不是严格需要的。


-1
   ps -A | grep nautilus | awk '{print "kill " $1}' | bash

我会这样做,但有很多方法可以执行同样的事情=)我已经在stackoverflow上详细写了这个答案,找到它在这里迁移。


为什么?好奇。特别关于最后一部分'awk'{print“kill”$ 1}'| bash'
matchew 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.