psの結果に「grep」が表示されないようにするにはどうすればよいですか?


304

存在しないプロセスを検索すると、たとえば

$ ps aux | grep fnord                          
wayne    15745  0.0  0.0  13580   928 pts/6    S+   03:58   0:00 grep fnord

明らかに私はgrepを気にしません-それはpsプロセスを検索するのと同じくらい理にかなっています!

grepが結果に表示されないようにするにはどうすればよいですか?


28
あなたは、プロセスのPIDのみが必要な場合は、交換することが可能ps aux |greppgrep(またはpgrep -f)。
ジョフェル

6
ServerfaultSuperuserについても同じ質問です。
トール

その出力は合法ですか?...実行しているfnordという名前のプログラムが存在しないようです
アコライト

4
@acolyte、まさにそれです-しかし、出力をgrepにパイプしているため、grepが実行されています(の出力を待っていますps aux)。そこで問題はないようにする方法をであるgrep fnord明らかに私は興味がないので、実行中のプロセスとして表示からその 1。
ウェインワーナー

2
@acolyte「fnord」の行が表示されないのは驚くことではありません。あなたはそれを見ることができないはずです。2〜3分の余裕がある場合は、検索してください。
フランチェスコ

回答:


439

keychainに解決策があることがわかりました。

$ ps aux | grep "[f]nord"

文字をブラケットで囲み、文字列を引用符で囲むことにより、正規表現を検索します。これは、「文字 'f'に続いて 'nord'を検索する」と言います。

しかし、パターンに括弧を入れると、「f」の後に「]」が続くためgrep、結果リストに表示されません。ネイト!


26
@acolyte:psからの出力には、で終わる行が含まれgrep [f]nordます。ただし、文字列[f]nordが正規表現と一致しないため、その行はgrepフィルターを通過しません[f]nord
-LarsH

9
@LarsH興味深い、ありがとう!私は提案ps aux | grep fnord | grep -v grepしていただろう...それはすでにいくつかの人々によって提案されているようだ...笑
アコライト

5
@progoはい、[bashで偶数を引用する必要があります。fnord現在のディレクトリで呼び出されるファイルで試してください。
ジル

25
の出力をグレープpsすることは古いトリックかもしれませんが、信頼できません。使用pgrep可能な場合。
ジル

8
@naxaあなたがプログラム呼び出しfnordと呼ばれるプログラムを持っていると想像してくださいsafnorde。または、というユーザーがいbfnordて、彼のプロセスをすべて強制終了します。など
ジル

164

私が使用する別のオプション(特にプロセスが実行されているかどうかを確認するためだけ)はpgrep コマンドです。これにより、一致するプロセスが検索されますが、検索用のgrep行はリストされません。正規表現やエスケープを行わずにすばやく検索できるため、気に入っています。

pgrep fnord

8
彼らは-fオプションがもっと似ていることを望むでしょうps | grep
ヨルダン

@jordanm実際にpgrep -fは、のようになりますps -f | grep
michelpm

5
-l一致しているコマンドを表示するための引数もあります。
パトリック

15
ps | grep '[f]nord'賢く由緒正しいですが、pgrepは正しいです。
小次郎

3
ps $(pgrep cmd) ...`pgrepにオプションがない場合はいつでも実行できます(ただし、空のコマンドセットでは機能しません)。
マチェイピエチョトカ

62

理想的なソリューションは、BriGuyによって提示されたものです

pgrep fnord 

しかし、それをしたくない場合は、次のようにしてgrepと一致するすべての行を除外できます。

ps aux | grep -v grep | grep "fnord"

7
しかし、私が探している行が「bash bash grep bash」である場合はどうでしょうか?
スパー

1
@Sparrその後、最適なソリューションを使用する必要があります:pgrepまたは別のソリューションを見つける;)
RSFalcon7

pgrepで名前の長さの制限に注意してください。-fを使用してフルパス名を取得します。そうしないと、長い名前で一致が失敗する場合があります。-lも一致をリストするのに便利です
ニールマクギル

25

最もエレガントなソリューションではありませんが、これを行うことができます:

$ ps aux | grep fnord | grep -v grep


それは悪い答えです!grepフレーズに単語があった場合。そのプロセスは表示されません。たとえば、呼び出されたファイルfoo_grep_bar.txtnanoコマンドによって編集されているとします。そのため、実行中のプロセスがあります。root 14908 0.0 0.0 110012 1692 pts / 3 S + Oct31 0:00 nano foo_grep_bar.txtこの回答によると、これは機能しません$ ps aux | grep nano | grep -v grep。ファイル名にgrepワードが含まれているためです。
ナビKAZ

私はこれを、受け入れられた答えよりもその意図についてより明示的であり、1つを除くすべてのケースで機能することを好む。
サマスピン

1
あたりとしてsuperuser.com/a/409658/450260あなたはフル除くべきであるgrep fnordだけでなく、grepすなわち $ ps aux | grep fnord | grep -v "grep fnord"
ダボス

15

zshので、grep fnord =(ps aux)

アイデアは、最初に実行しps aux、結果をファイルに入れてから、そのファイルで使用grepすることです。ただ、zshの「プロセス置換」を使用するため、ファイルはありません。

説明のために、試してください

ps aux > ps.txt
grep fnord ps.txt
rm ps.txt

結果は同じになります。

他の回答のいくつかに関する一般的なコメント。一部は複雑から遠い、および/または長い入力です。それは正しいというだけでなく、同様に使用できるはずです。しかし、それはそれらの解決策のいくつかが悪いことを意味しません。のみ、それらを使用可能にするためにミニUI内にラップする必要があります。


1
zshのプロセス置換を知らないが、2つのプロセスが並行してではなく、次々と呼び出されることは確かですか?
パエロエベルマン

3
@PaŭloEbermann:並列の場合は<(command)です。grep grep =(ps aux)行を表示しません。
マチェイピエチョトカ

Zshは、psからの出力を「一致」させることもできます。print -l ${(M)${(f)¨$(ps aux)¨}:#*fnord*}
Friartek

7
ps aux | grep $(echo fnord | sed "s/^\(.\)/[\1]/g")

3
これはIOCCCのように見えますが、UnixのコマンドラインではなくC ^^だけ| grep $(echo fnord)では不十分でしたか?また、sedに「fnord」の各文字を検索して独自の値に置き換えるように依頼しますか?^^おめでとうございます。もっと長くできるとは思いますが、おそらくそれほど面白くはないでしょう^^
オリビエデュラック

1
上記のコメントのトーンが不快に聞こえるかもしれませんが(5分後には編集できません)、おaび申し上げます...あなたの答えは本当にうれしそうな読みでした。私は本当にあなたが意図的にこのようにしたと思います^^
オリビエデュラック

1
謝罪しないでください、あなたの答えは読むのが本当に楽しかったです(そして正真正銘も)。とにかくpgrep -l $ 1を意味しました;)
yPhil

3
@OlivierDulac:彼は最初のcharを独自の値に置き換えるだけではありません。彼は、その値を角括弧で連結したものに置き換えます。(これらの角かっこは特別なものではなく、文字通りです。)基本的に、彼はWayne Wernerの答えを一般化しているため、最初の文字を角かっこで囲むプロセスをスクリプト化できます。+1
LarsH

2
ps aux | grep '[^]]fnord'その体操を避けるでしょう。
ステファンシャゼル

6

answer この回答はGNU固有のものです。より一般的なソリューションについては、ウェインの回答を参照してください。

プロセスの検索

fnordプロセスを探しているだけの場合は、-Cオプションを使用してコマンド名で選択できます。

ps -C fnord

これは、好みに応じてBSDスタイルおよびPOSIXスタイルのフォーマットオプションと組み合わせることができます。完全なリストについては、psのマニュアルページを参照してください

他の何かをお探しですか?

コマンド名を正確に検索するよりも高度なものが必要な場合は、希望を失わないでください!これはまだpsパイプの側面で行うことができます。私たちがしなければならないことは、結果からプロセスpsを除外するように言うgrepことです:

ps -NC grep | grep 'fnord'

-C grepすべてのgrepプロセスを選択し-N、選択を無効にします。これは、コマンド引数、コマンド名の一部、またはより複雑な正規表現の検索に使用できます。


1
これは、GNUと良いですpsが、-CPOSIXによって指定されていないとBSDのAA全く異なる意味を持っている
エリックRenouf

BSDに相当するものはありません(Macでは動作しません)。ps -Cを使用することは、これらのいずれの中でも最も単純な答えです。
クリストファーハンター

3

私の答えは、「ps」リストで「foobar」を検索するための典型的な答えのバリエーションです。「-A」「ps」の引数は「aux」よりも移植性が高いと思いますが、この変更は答えとは無関係です。典型的な答えは次のようになります。

$ ps -A -ww | grep [f]oobar

代わりに、次のパターンを使用します。

$ ps -A -ww | grep [^]]foobar

主な利点は、静的パターン "[^]]"を探しているパターンと単純に連結するだけなので、このパターンに基づいてスクリプトを記述しやすいことです。文字列の最初の文字を取り除き、それを角括弧の間に挿入し、それを再び連結する必要はありません。シェルでスクリプトを作成するときは、探しているパターンの前に「[^]]」を貼り付ける方が簡単です。Bashでの文字列スライスは見苦しいため、私のバリエーションではそれを避けています。このバリエーションは、パターンが先頭の右角かっこなしで一致する行を表示すると言います。角かっこを除外する検索パターンは実際に角かっこをパターンに追加するため、一致することはありません。

したがって、次のように移植可能な「psgrep」コマンドを作成できます。ここでは、Linux、OS X BSD、その他の違いを考慮します。これにより、「ps」の列ヘッダーが追加され、ニーズに合ったよりカスタムな「ps」形式が提供され、余分な、非常に広いリストプロセスが表示されるため、コマンドライン引数が失われることはありません。まあ、ほとんどが見逃されていません。JavaはJavaであるため、可能な限り最悪の方法で処理されることが多いため、一部のJavaサービスは、プロセステーブルが追跡する引数の最大許容長を超えて実行されます。これは1024文字だと思います。プロセスを開始するために許可されるコマンドローンの長さははるかに長くなりますが、カーネルプロセステーブルは1Kを超える長さを追跡しません。コマンドが開始されると、コマンド名と引数リストは '

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}

2

これを行う最も単純なシェルに依存しない方法は、最初に変数に格納することです。

PS_OUTPUT="$(ps aux)"; echo "$PS_OUTPUT" |grep fnord

コールアウト:@EmanuelBergのgrep fnord =(ps aux)答えは、最もエレガントですが、が必要zshです。私は簡単にrcファイルにそれを入れましたが、bashは、その評価を妨げる条件があるにもかかわらず、その構文について文句を言います。


私のrcファイルから、grepの引数を取る大文字と小文字を区別しないバージョンがあります:

psl() {
  local PS_OUTPUT="$(ps auxww)"
  echo "${PS_OUTPUT%%$'\n'*}" >&2  # title, in stderr to avoid pipes
  echo "${PS_OUTPUT#*$'\n'}" |grep -i "${@:-^}"
}

コードウォーク、コードの行ごとに1つの箇条書き:

  • 詳細なps出力をキャプチャします(local変数で、関数が戻ると消えます)
  • タイトルに影響を与えずに結果をさらにフィルタリングできるように、標準エラーで最初の行(タイトル)を表示します。置換は言う:取る$PS_OUTPUT、最初の改行(regex equiv:)の後にすべてをして削除しますs/\n.*$//msg。これにより、タイトルをgrepできなくなります
  • 最初の行(regex equiv:)を除くpsすべてで出力を表示し、大文字と小文字を区別せず、この関数に渡されるすべての引数でその内容をgrepします(引数がない場合、一致する行の先頭に一致します)すべて)s/^.*\n//m-i^

1

今回は実際のシーケンスを使用するかもしれません。パイプを使用すると、パイプが平行になります。

ps aux >f && grep tmpfs <f

file fがあるのでUいですが、以前に実行したプロセスの出力を引き続き使用したいシーケンシャルプロセスの構文がないのは私のせいではありません。

順次演算子の構文に関する提案:

ps aux ||| grep tmpfs

一般の人々がストリームを簡単にフィルタリングできないことは、エリートがシーケンスに基づいて自分自身をベースにする理由にはほとんどなりません。それはコンピューティングの後退です。
Acumenus 14

@ABB en.wikipedia.org/wiki/Communicating_sequential_processesには、トンプソンシェルで終わる演算子よりも多くの演算子があります。順次のオペレーターが存在する可能性があり、そのオペレーターは、終了するとすぐにシーケンス内の次のプロセスに結果を伝えます。追加の演算子を提供することによる「コンピューティングの後退」は、少し厳しいようです。
アンヴァンロッサム14

ナイスリンクですが、もちろん、並列処理に比べて、CPUとメモリ(またはディスク)の両方の使用においてシーケンシャル処理の方が劣っています。この場合、最初にすべてのps出力を保存する必要がある場合grepは、より多くのメモリ(またはディスク)を使用しています。
アキュメナス

0

pgrepコマンドは、他の人が述べているように、名前やその他の属性に基づいてプロセスのPID(プロセスID)を返します。例えば、

pgrep -d, -u <username> <string>

userによって実行されている名前に一致するすべてのプロセスのコンマ(、)で区切られたPIDを提供します<username>。前に-xスイッチを使用して、完全一致のみを返すことができます。

これらのプロセスに関する詳細情報を取得したい場合(psからauxオプションを実行すると暗示される)、psで-pオプションを使用できます。これはPIDに基づいて一致します。たとえば、

ps up $(pgrep -d, -u <username> <string>)

pgrepコマンドで一致したすべてのPIDの詳細情報を提供します。


pspgrep空のセットを返すと失敗します。私はあなたの上に構築され、この問題に対処しようとする答えを持っています
Acumenus 14

0

プロセス自体のssh-agentPIDを表示せずにユーザー名のPIDを見つける簡単な例を次に示しますgrep

ps xu | grep "${USER}.*[ ]/usr/bin/ssh-agent" | awk '{print $1 $2;}'

たとえばssh-agent、現在のユーザーを強制終了するには、次のコマンドを使用します。

kill `ps xu | grep "${USER}.*[ ]/usr/bin/ssh-agent" | awk '{print $2;}'`

便利なエイリアスを作成するには、〜/ .bashrcまたは〜/ .zshrcファイルに次のコードを追加します。

function function1 () {
    ps xu | grep "$1.*$2" | awk '{print $1" "$2" "$11;}'
}
alias mygrep="function1"

また、ここでエイリアスを使用することは、全員に正規表現を強制的に学習させる例です。

. /etc/profile #to make alias usable
mygrep ${USER} ${PROCESS_PATH}
mygrep ${USER} "[f]nord"
mygrep "[f]nord"
mygrep ".*[s]shd"

PSこれらのコマンドはUbuntuとGentooでのみテストしました。


(1)ユーザーが自分のプロセスの1つを探しているという質問ではありません。ユーザーは、探しているプロセスの所有者を知らない可能性があります。(2)この答えと同じくらい派手ですが、あなたが言ったなら、それはまだ失敗するでしょう"${USER}.* /usr/bin/ssh-agent"。あなたが言ったので、それは動作します[ ]。つまり、受け入れられた答えのメカニズムを使用しているだけです。あなたもそうかもしれませんgrep "[s]sh-agent"
Gマン

あなたが正しいです。(1)時々このページに直面しているので、役に立つかもしれないものを共有しました(2)はい、受け入れられた答えのように正規表現を使用しました。(3)回答を更新して、受け入れられたものと同じになるようにしましたが、ユーザー名を指定して、または指定せずに使用するエイリアスの作成方法とエイリアスも示しました。(4)関数の定義方法も示しましたが、必須ではありませんが、$ 1と$ 2が重複しないため、興味深い方法で機能します。Thx#G-マン
コンスタンティン

-1

次の.bashrc ようにエイリアスを定義するだけで簡単にできます:

alias grep='grep -v grep | grep'

誰がダウン投票したのか、なぜ投票したのかはわかりませんが、これにより、pgrepではできないpsを完全に使用できます。
オプティサイクリック

これにより、他のgrepプロセスが誤って除外されるだけでなく、またgrep、他の場合には使用法を壊します。試してみてくださいecho I love grep | grep love
トロソ

@trososほぼ11年、私は* .nix-ingをしてきました..そのパターンを使用したことはありません...おそらく来年-誰が正しいか知っています。
A20

-1

-x(完全一致)オプションを使用するとうまくいきました。-f(完全なコマンドライン)と組み合わせたため、プロセスを次のように正確に一致させることができました。

pgrep -x -f "path_i_used_when_starting/cmd params_i_used"

ドライブバイダウン投票をしている人は誰でも自分自身を説明しますか?これは何年もの間私のためにこの問題を解決するために働いてきました。
ムードブーム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.