シェルの `|`記号の意味は何ですか?


16

コマンドでの|記号の意味は何sudo ps -ef | grep processnameですか?

また、誰もこのコマンドを説明できますか?このコマンドは、PIDを取得してそのプロセスを強制終了するためにのみ使用sudo ps -ef | grep processname | grep -v grepしました-v grepが、以前に生成されたPIDを強制終了するような印象を受けていgrepます。もしそうなら、それはどのように機能しますか?


4
sudo実行する必要はありませんps -ef。:また、3番目のコマンドを回避するための一般的なトリックは、角括弧内のプロセスの名前の文字囲みれるps -ef | grep [p]rocessname
コス

1
コマンドが確実に仕事に引用符を必要としていることを@kos:ps -ef | grep '[p]rocessname'
kasperd

2
@kosを記述grep [p]rocessnameすると、現在のディレクトリでprocessnameファイルを名前で検索し、パターンをそのファイルの名前で置き換えるようにシェルに指示しています。指定されたファイルがprocessname存在しない場合、シェルはパターンをそのままgrepに渡すことができます。ただし、それは設定によって異なります。名前のファイルがあれば、あなたのバージョンが壊れますので、processname存在するか、次のシェルのいずれかのオプションが有効になっている場合はfailglobnullglobnocaseglob
カスペルド

1
@kasperdあなたの最後のコメントを読み違えました、はい、あなたはすべてについて正しいです。私はそれを考慮しませんでした。
コス

1
これが複製ではないとは信じられません。
マスト

回答:


13
ps -ef | grep processname

最初に実行されsudo ps -ef、出力が2番目のコマンドに渡されます。

2番目のコマンドは、単語「processname」を含むすべての行をフィルタリングします。

ps -ef | grep processname | grep -v grepを含む行と含まprocessnameないすべての行をリストしますgrep

による man grep

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

による man ps

ps displays information about a selection of the active processes.

-e     Select all processes.  Identical to -A.

-f     Do 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.

パラメータ-efは、と同じ意味で組み合わせることができます-e -f

実際にps -ef | grep processname呼び出されたプロセスのすべての発生をリストしますprocessname


説明ありがとう、ps -ef正確には何をしますか?
アーミル

私たちは実行したときに考える| grep processNameターミナルたちにも-vがこの出力を殺すように、自身がプロセスではgrepの出力を得る
アーミル

あなたは正しいです。
パイロット

35

という名前pipeです。最初のコマンドの出力を2番目のコマンドの入力として提供します。

あなたの場合、それは次
のことを意味します:の結果sudo ps -efはの入力として与えられますgrep processname

sudo ps -ef
これは、実行中のすべてのプロセスをリストします。man psより多くの用語を入力します。

grep processname
したがって、このプロセスのリストはgrepに送られ、grepはで定義されたプログラムを検索するだけprogramnameです。

sudo ps -ef | grep firefox私の端末で入力すると戻ります:

parto     6501  3081 30 09:12 ?        01:52:11 /usr/lib/firefox/firefox
parto     8295  3081  4 15:14 ?        00:00:00 /usr/bin/python3 /usr/share/unity-scopes/scope-runner-dbus.py -s web/firefoxbookmarks.scope
parto     8360  8139  0 15:14 pts/24   00:00:00 grep --color=auto firefox

わかりました、何-v grep、それは何をしますか。
アーミル

良い説明は、しかし、私はどのようにいくつかの助けが必要な-v grep 機能を...
アーミル

ああ、なぜgrep -v使用されるのかわかります。最後の行を除外します。
Pilot6

@Aamir私の答えをご覧ください。grep -vパターンを含むOUT行をフィルタリングします。
Pilot6

1
複数のパイプを使用できることを追加することもできます。例:echo "foobar" | grep foo | grepバー
マイケル

7

私はこれを簡単な実践的な答えで試してみようと思います:

パイプを|使用すると、シェルで素晴らしいことができます!それは私が最も有用で力強いと考える単一の演算子です。

ディレクトリ内のファイルを数えるのはどうですか?シンプル:

ls | wc -l出力を..redirect lswcウィットパラメータ-lライン用

またはファイル内の行のカウント?

cat someFile | wc -l

何かを検索したい場合はどうすればよいですか?'grep'は、文字列の出現を検索できます。

cat someFile | grep aRandomStringYouWantToSearchFor

パイプの左側のコマンドの出力をパイプの右側のコマンドにリダイレクトするだけです。

もう1つのレベル:ファイルで何かが発生する頻度は?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

|を使用できます ほとんどすべてのために:)

fortune | cowsay

ここに画像の説明を入力してください


2
はい、パイプは楽しい、+ 1、しかし例を変更してください:UUOC
コス

好き:grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
サディ

ofc。しかし、簡単にするために...質問者はgrepでより深くはないようです。例:)
Gewure

1
率直に言って、あなたの例の多くはパイプを必要としません。解体について聞いたことがありますか?多くのコマンドがファイルをパラメーターとして直接使用する場合、catとpipeを使用しています。grep aRandomStringYouWantToSearchForはgrep aRandomStringYouWantToSearchFor someFileである必要があります
キャプテンレプトン

みんな。コメント、キャプテンを読んだら、私の返事を読んでいたでしょう。質問をした人はパイプの実際のアプリケーションを理解しません-彼はgrepが何であるかさえ知りません。彼にこの例を挙げましょうか? kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') いいえ、それはまったく目的を果たさないからです。
ゲーア

4

このコマンドは、PIDを取得してそのプロセスを強制終了するためにのみ使用しました

他の答えはあなたの主な質問にすでに答えていますが、私もこれに対処したいと思います。

一般的に殺害プロセスは、しばしば厄介な状態の周りのプロセスによって割り当てやり過ぎや葉のリソースで、あなたは、多くの場合、単にすることができます終了し、それを。

これに加えて、pkillプロセスを強制終了/終了するために使用します。pkill正確なプロセス名または正規表現の指定をサポートしています:

pkill -x foo # Terminates process foo
pkill ^foo$ # Terminates process foo
pkill -9 -x foo # Kills process foo
pkill -9 ^foo$ # Kills process foo

1
kill -9他の信号が機能しないことが明確にわかっていない限り、使用しないでください。iki.fi/era/unix/award.html#kill
tripleee

@tripleee OPは、彼らがしたい述べ殺すかのプロセスを。
コス

それがそうkillです。指定-9は追加であり、ほとんどの場合、悲惨な追加オプションです。
トリプリー

@tripleee用語が原因で混乱が生じていると思います。私にはkill = SIGKILLであり、SIGTERMではありません。
コス

ほとんどの人にとって、「殺す」とはkill、単純で単純なことを意味すると期待しています。専門用語は別として、あなたがあなたに答えるのは、あなた-9が肉付きの良い警告を与えない限り、人々にオプションを使うように勧めるべきではありません。
トリプリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.