web-dev-qa-db-ja.com

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

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

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

明らかに、grepは気にしません-psプロセスを検索するのと同じくらい意味があります!

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

323
Wayne Werner

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

$ ps aux | grep "[f]nord"

文字を角括弧で囲み、文字列を引用符で囲むことにより、「文字「f」に続けて「nord」を検索する」という正規表現を検索します。

ただし、パターンに角かっこを配置したため、 'f'の後に ']'が続くため、grepは結果リストに表示されません。ネイト!

463
Wayne Werner

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

pgrep fnord
173
BriGuy

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

pgrep fnord 

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

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

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

$ ps aux | grep fnord | grep -v grep

26
Brandon Kreisel

Zshでは、grep fnord =(ps aux)

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

説明するには、試してください

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

結果は同じになるはずです。

一般的なコメント他のいくつかの回答について。中には、かなり複雑なタイプや長いタイプのものもあります。正しいだけでなく、使えるはずです。しかし、それはそれらのソリューションのいくつかが悪いことを意味するものではありません。ただし、それらを使用できるようにするには、ミニUI内にラップする必要があります。

16
Emanuel Berg

この回答はGNU固有です。より一般的な解決策は Wayneの回答 を参照してください。

プロセスの検索

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

ps -C fnord

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

他に何かお探しですか?

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

ps -NC grep | grep 'fnord'

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

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

私の答えは、「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
}
3
Noah Spurrier

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

_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_を取り、最初の改行の後のすべてを削除する(正規表現の同等:_s/\n.*$//msg_)。これにより、タイトルをgrepできなくなります
  • ps出力をすべてexceptで表示し、最初の行(regex equiv:_s/^.*\n//m_)を表示して、その内容を_-i_は大文字と小文字を区別せず、すべての引数でこの関数を渡します(引数がない場合、_^_。これは、すべての行の先頭と一致してすべてに一致します)。
2
Adam Katz

次に、grep -v grepソリューションの拡張バージョンを示します。1秒以上実行されていないすべてのgrepプロセスを除外します。これは、「grepのすべての発生を破棄する」よりも優れています。

$ ps -ef | grep -vw "00:00:00 grep" | grep <searchTerm>

それぞれ

$ ps aux | grep -vw "0:00 grep" | grep <searchTerm>

これは移植できない場合があり、ローカルのpsコマンドの実際の出力形式によって異なります。

便宜上、これを色付きのgrep出力と組み合わせることができます。

$ alias grep='grep --color=auto'
1
Murphy

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

ps aux >f && grep tmpfs <f

醜いのはファイルfがあるからですが、以前に実行したプロセスの出力を引き続き使用したい順次プロセスの構文がないのは私のせいではありません。

順次演算子の構文の提案:

ps aux ||| grep tmpfs
0
Anne van Rossum

以下は、grepプロセス自体のPIDを表示せずに、ユーザー名のssh-agentのPIDを見つける簡単な例です。

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"

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

0

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

pgrep -x -f "path_i_used_when_starting/cmd params_i_used"
0
moodboom

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

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

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

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

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

pgrepコマンドで一致したすべてのPIDの詳細情報が表示されます。

0
eToThePiIPower