0

私は次のようにプロセスを数えています:

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一度に 1 つずつ検索するにはどうすればよいでしょうか?

望ましい結果: (説明のための明白な偽のプレースホルダー付き)

// 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です。

4

1 に答える 1

1

これは役に立ちますか?

ps aux|grep -Pc 'my_script[.]ph[p].*[\s&]bar='
  • -Pパール正規表現を使用する
  • [.]単一の文字ではなく、リテラルのドットと一致させる
  • 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
于 2014-11-26T21:30:14.997 に答える