我正在计算这样的流程:
ps aux | grep my_script.php | grep -v grep | wc -l
但这包括my_script.php foo=1
和my_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
。
答案 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