よりエレガントな「ps aux | grep -v grep」


177

プロセスのリストをチェックして、私にとって興味深いプロセスを「grep」すると、grepそれ自体も結果に含まれます。たとえば、端末を一覧表示するには:

$ ps aux  | grep terminal
user  2064  0.0  0.6 181452 26460 ?        Sl   Feb13   5:41 gnome-terminal --working-directory=..
user  2979  0.0  0.0   4192   796 pts/3    S+   11:07   0:00 grep --color=auto terminal

通常、私ps aux | grep something | grep -v grepは最後のエントリを取り除くために使用しますが、エレガントではありません:)

この問題を解決するためのよりエレガントなハックはありますか(すべてのコマンドを別のスクリプトにラップすることの一部であり、これも悪くないことです)


4
価値のあるものとしては、これは古代のFAQです。で項目3.10を参照してくださいfaqs.org/faqs/unix-faq/faq/part3
tripleee

1
参照いただきありがとうございます。それが彼らの方法ですps ux | awk '/name/ && !/awk/ {print $2}'
。–ジャクブM. 2013

何をしgrep -v grepているのですか?
Jwan622 2017

2
@ Jwan622 grep -v grepgrepgrepの結果から除外します。grepをpsと組み合わせて使用​​すると、grepプロセス(grep引数付き)も表示され、結果が乱雑になります。grep -v grepはそれを回避する一般的な方法です
Eugene Platonov 2017

回答:


282

通常のテクニックはこれです:

ps aux | egrep '[t]erminal'

これはを含む行に一致しますがterminal、一致egrep '[t]erminal'しません!また、Unixの多くのフレーバーでも動作します。


1
これは、任意の文字列では機能しますが、ユーザー名では機能しませんps aux | grep '[r]oot'。なぜ誰か知っていますか?
kxsong 2014年

2
@kxsong:| grep '[t]erminal'「terminal」という単語をプロセスリストに含めずに、「terminal」という単語を含む行を選択します。あなたは何を達成しようとし| grep '[r]oot'ていますか、それはどのように機能していませんか?より良い解決策がありそうです。
Johnsyweb 2014年

3
私が間違っている場合は修正してください。ただし、これはgreppedキャラクターのどの位置でも機能するはずです:ps aux | grep "te [r]
minal

2
見事なハック(aux / grepの作者はおそらくこのシナリオを考えていなかったので、私はそれを呼ぶべきだと思います。)
Michael Trouw

2
@JamieJag:まあ...私の投稿で言ったように、grep '[t]erminal'を含む行に一致しますterminal。からの出力ps auxには、grep '[t]erminal'(角括弧を含む)の行があり、文字列を含まないterminal(同じではない)。
Johnsyweb 2016年

57

pgrepを使用します。より信頼性が高くなります。


pgrepたとえば、私が探しても機能しないps aux | grep 'ssh options'
Jakub M.

12
Jakub M .:どうpgrep -fですか?
hillu 2013

4
@ jakub-mデフォルトpgrepでは、パターンはプロセス名に対してのみ一致します。コマンド全体と照合するには、-fフラグを使用します。
bluecollarcoder 14年

3
pgrepプロセスIDのみを返します。
MELAB

1
古いバージョンがかかりましたpgrep -fl(ただし、完全なコマンドラインと-f一致しないと完全なコマンドラインを表示できませんでした。詳細:serverfault.com/a/619788/44183)。ただし、pid、cmdline以外の情報が必要な場合は、必要psです。それらを組み合わせることができます:ps -p $(pgrep -f foo)
Beni Cherniavsky-Paskin 2017

29

この答えは、以前の pgrep 回答にます。また、との使用を組み合わせた別の回答に基づいpsていpgrepます。以下は、関連するトレーニングの例です。

$ pgrep -lf sshd
1902 sshd

$ pgrep -f sshd
1902

$ ps up $(pgrep -f sshd)
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

$ ps up $(pgrep -f sshddd)
error: list of process IDs must follow p
[stderr output truncated]

$ ps up $(pgrep -f sshddd) 2>&-
[no output]

上記は関数として使用できます:

$ psgrep() { ps up $(pgrep -f $@) 2>&-; }

$ psgrep sshd
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

での使用psと比較してくださいgrep。有用なヘッダー行は印刷されません。

$  ps aux | grep [s]shd
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

github.com/blueyed/oh-my-zsh/blob/…を参照してください(ただし、Zshに固有です)。
2015年

@blueyed、私はbash関数の定義で答えを更新しました。
Acumenus 2015年

-dセパレータを指定するオプションにも注意してください。例ps -fp$(pgrep -d , getty)
Toby Speight 2016

1
私はこれを使用します。これは最後のパラメータps uxp `pgrep <process>` pなければなりません(つまり、機能しpuxません)
KFL

9

あなたはpsコマンドでフィルタリングすることができます、例えば

ps u -C gnome-terminal

(またはfindなどを使用して/ procを検索


1
これはGNUのps(Linux)では機能しますが、BSD psでは機能しないことに注意してください。
Josh

これはGNU psでも正しくありません。 ps -C <command>正確なコマンドと一致します。で使用する場合axオプションので、それは、すべてのプロセスを報告しますax、リストが処理以外に他の手段で一致したプロセスのセットに。
アニミズム

@Animism True。ありがとう、修正しました。
Andreas Frische

これは、プロセス名が正確に指定されている場合にのみ機能します。それは、部分一致のために例えば動作しないlogindためsystemd-logind、または引数と一致します。
Acumenus 2016年

4

もう一つの選択肢

ps -fC terminal

ここにオプションがあります:

 -f        does full-format listing. This option can be combined
           with many other UNIX-style options to add additional
           columns. It also causes the command arguments to be
           printed. When used with -L, the NLWP (number of
           threads) and LWP (thread ID) columns will be added. See
           the c option, the format keyword args, and the format
           keyword comm.

 -C cmdlist     Select by command name.
                This selects the processes whose executable name is
                given in cmdlist.

6
マイナーな欠点と、OPの質問に実際には関連しない欠点の1つは、Tomcatのように表示されないことです。Tomcatは、実際には、引数のリストを備えたjavaとして実行されます。
Charles Wood

-Cオプションは、1年半前に投稿された@Andreas Frisheの回答ですでに提案されていました…
Piotr Dobrogost

3

大括弧を使用して検索パターン内の文字を囲むとgrep、一致する正規表現が含まれていないため、プロセスが除外されます。

$ ps ax | grep 'syslogd'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd
18108 s001  S+     0:00.00 grep syslogd

$ ps ax | grep '[s]yslogd'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd

$ ps ax | grep '[s]yslogd|grep'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd
18144 s001  S+     0:00.00 grep [s]yslogd|grep

3

免責事項:私はこのツールの作成者ですが...

私はpxを使用します:

~ $ px atom
  PID COMMAND          USERNAME   CPU RAM COMMANDLINE
14321 crashpad_handler walles   0.01s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Electron Framework.framework/Resources/crashpad_handler --database=
16575 crashpad_handler walles   0.01s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Electron Framework.framework/Resources/crashpad_handler --database=
16573 Atom Helper      walles    0.5s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --type=gpu-process --cha
16569 Atom             walles   2.84s  1% /Users/walles/Downloads/Atom.app/Contents/MacOS/Atom --executed-from=/Users/walles/src/goworkspace/src/github.com/github
16591 Atom Helper      walles   7.96s  2% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --type=renderer --no-san

賢明なコマンドラインインターフェースでプロセスを見つけることを除いて、それは他の多くの便利なことも行います、プロジェクトページの詳細

LinuxおよびOS Xで動作し、簡単にインストールできます。

curl -Ls https://github.com/walles/px/raw/python/install.sh | bash

0

最終的なユースケースによっては、代わりにAwkを使用することがよくあります。

ps aux | awk '/[t]erminal/'

これは、次のような場合に特に当てはまります。

ps aux | grep '[t]erminal' | awk '{print $1}'  # useless use of grep!

明らかに、正規表現をAwkスクリプトに簡単に組み込むことができます。

ps aux | awk '/[t]erminal/ { print $1 }'

しかし、実際には、これを自分で作り直さないでください。pgrep友人たちは長い間存在し、この問題全体をほとんどのアドホックな再実装よりもはるかにうまく処理しています。


-2

別のオプションは、あなた.bash_profile(またはbashエイリアスを保持している他のファイル)を編集して、結果から「grep」を読み取る関数を作成することです。

function mygrep {
grep -v grep | grep --color=auto $1
}

alias grep='mygrep'

grep -v grep最初にそれ以外の場合は、あなたでなければなり--color=auto意志が何らかの理由で動作しません。

これは、bashを使用している場合に機能します。別のシェルYMMVを使用している場合。


1
エイリアス関数は何ですか?ただ実行してくださいfunction grep { command grep -v grep | command grep --color=auto "$@"; }(引数と引用の修正にも注意してください)。ただし、の非ps呼び出しgrepは機能しなくなる(引数が正しく渡されない)ため、これは壊れています。とにかく、はるかに便利な関数はgrepgrep結果から個別にフィルターで除外するのではなく、正規表現を変更してそれ自体と一致しないようにする関数です。そしてもちろん、数十年前に適切に解決された問題に対する新しい解決策を発明することは、あまり生産的ではありません。
Tripleee、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.