如何从包含特定参数的进程计数中排除结果?

时间:2014-11-26 21:11:34

标签: regex grep ps wc

我正在计算这样的流程:

ps aux | grep my_script.php | grep -v grep | wc -l

但这包括my_script.php foo=1my_script.php foo=1&bar=2的结果。

我如何区分这些计数?我想计算一下,有多少参数bar与不包括bar的参数分开。

假设上面的ps aux...返回2(一个带有参数bar而另一个没有),我怎样才能一次搜索每个?

期望的结果:(有明显的假占位符用于说明)

// list all my_script.php processes
$ ps aux | grep my_script.php | grep -v grep
root  10 ... Ss  14:34 0:53 php /path/to/my_script.php foo=1&bar=2
root  12 ... Ss  14:35 0:46 php /path/to/my_script.php foo=1
// returns 2 lines (this works)

// Just count just those including the `bar` argument
$ ps aux | grep my_script.php _____+bar_____ | grep -v grep | wc -l
// return 1

// Just count only those NOT including the `bar` argument
$ ps aux | grep my_script.php _____-bar_____ | grep -v grep | grep -v bar | wc -l
// return 1

更新

我可以粗略地排除bar结果,如下:

$ ps aux | grep my_script.php | grep -v grep | grep -v bar | wc -l

显然,当脚本名称或路径可能包含bar字符串时,这将不起作用,但是现在它适用于我。我追求的主要是如何计算相反的情况。也就是说,如何计算仅包括bar

的那些

1 个答案:

答案 0 :(得分:1)

这有帮助吗?

ps aux|grep -Pc 'my_script[.]ph[p].*[\s&]bar='
  • -P使用perl regex
  • [.]使其与文字点匹配,而不是任何单个字符
  • ph[p]过滤grep进程本身
  • [\s&]bar=这匹配为空或& + bar=
  • -c仅返回匹配行数

示例,(模拟ps输出的文本文件):

kent$  cat f
root  10 ... Ss  14:34 0:53 php /path/to/my_script.php foo=1&bar=2
root  12 ... Ss  14:35 0:46 php /path/to/my_script.php foo=1
root  12 ... Ss  14:35 0:46 php /path/to/my_script.php foobar=1
root  12 ... Ss  14:35 0:46 php /path/to/my_script.php bar=1

kent$  grep -Pc 'my_script[.]ph[p].*[&\s]bar=' f
2