存在しないプロセスを検索すると、たとえば.
$ ps aux | grep fnord
wayne 15745 0.0 0.0 13580 928 pts/6 S+ 03:58 0:00 grep fnord
明らかに、grepは気にしません-ps
プロセスを検索するのと同じくらい意味があります!
Grepが結果に表示されないようにするにはどうすればよいですか?
keychain に解決策があることがわかりました。
$ ps aux | grep "[f]nord"
文字を角括弧で囲み、文字列を引用符で囲むことにより、「文字「f」に続けて「nord」を検索する」という正規表現を検索します。
ただし、パターンに角かっこを配置したため、 'f'の後に ']'が続くため、grep
は結果リストに表示されません。ネイト!
私が使用するもう1つのオプション(特に、プロセスが実行されているかどうかを確認するためだけに)は、pgrep
コマンドです。これにより、一致するプロセスが検索されますが、検索用のgrep行はリストされません。何も正規表現やエスケープせずにすばやく検索できるため、気に入っています。
pgrep fnord
理想的なソリューションは、BriGuyによって提示されたものです
pgrep fnord
しかし、それを実行したくない場合は、grepと一致するすべての行を除外できます。
ps aux | grep -v grep | grep "fnord"
最もエレガントなソリューションではありませんが、これを行うことができます:
$ ps aux | grep fnord | grep -v grep
Zshでは、grep fnord =(ps aux)
。
アイデアは、最初にps aux
、結果をファイルに入れ、そのファイルでgrep
を使用します。ただし、zshの「プロセス置換」を使用しているため、ファイルはありません。
説明するには、試してください
ps aux > ps.txt
grep fnord ps.txt
rm ps.txt
結果は同じになるはずです。
一般的なコメント他のいくつかの回答について。中には、かなり複雑なタイプや長いタイプのものもあります。正しいだけでなく、使えるはずです。しかし、それはそれらのソリューションのいくつかが悪いことを意味するものではありません。ただし、それらを使用できるようにするには、ミニUI内にラップする必要があります。
⚠この回答はGNU固有です。より一般的な解決策は Wayneの回答 を参照してください。
fnord
プロセスだけを探している場合は、-C
コマンド名で選択するオプション:
ps -C fnord
これは、好みに応じて、BSDおよびPOSIXスタイルのフォーマットオプションと組み合わせることができます。完全なリストについては ps man page を参照してください。
コマンド名の正確な検索よりも高度なものが必要な場合は、希望を失わないでください。これはまだパイプのps
側で行うことができます。 ps
に結果からgrep
プロセスを除外するように指示するだけです。
ps -NC grep | grep 'fnord'
-C grep
はすべてのgrepプロセスを選択し、-N
は選択を無効にします。これは、コマンド引数、コマンド名の一部、またはより複雑な正規表現を検索するために使用できます。
ps aux | grep $(echo fnord | sed "s/^\(.\)/[\1]/g")
私の答えは、「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
}
これを行う最も簡単なシェルに依存しない方法は、最初に変数に格納することです。
_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
_は大文字と小文字を区別せず、すべての引数でこの関数を渡します(引数がない場合、_^
_。これは、すべての行の先頭と一致してすべてに一致します)。次に、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'
今回は実際のシーケンスを使用するときかもしれません。パイプの使用はそれを平行にします。
ps aux >f && grep tmpfs <f
醜いのはファイルf
があるからですが、以前に実行したプロセスの出力を引き続き使用したい順次プロセスの構文がないのは私のせいではありません。
順次演算子の構文の提案:
ps aux ||| grep tmpfs
以下は、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でのみテストしました。
-x(完全一致)オプションを使用するとうまくいきました。 -f(完全なコマンドライン)と組み合わせたので、プロセスを次のように正確に一致させることができます。
pgrep -x -f "path_i_used_when_starting/cmd params_i_used"
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の詳細情報が表示されます。