最も簡単な方法は、grep
より少しスマートなものを使用することです。たとえば:
ps aux | perl -ne 'print if $. == 1 || m/process_name/'
はps aux
の最初の行に印刷されますの出力に加え、POSIX BREのより強力なので、より複雑なPerlの正規表現—あるprocess_name
に一致するすべての行を(が、私はドン "あなたがプロセス名を探しているならば、驚きを見つけるでしょう)。 、そのことについてはをps aux
のヘッダは実行の間に変更することはほとんどありませんから、あなたが書くことができます::
ps aux | head -1 ; ps aux | grep process_name
それはまだ1」としてカウントされている場合、私は知りませんが追加する
編集コマンドの行 "。 :-)
その他のオプション:あなたは上記が気に入らないので、ここにいくつかあります。この1つは読み込んで処理するために読んで、直接、最初の行を印刷した後、grep
のための残りの部分を残します:
ps aux | ((read -r LINE ; echo "$LINE") ; grep process_name)
すべての行を引き起こしますこの1つは、標準出力(ファイルディスクリプタ1
)との両方に書き込まれますカスタムファイル記述子(3
)。 grep
は、カスタムファイルディスクリプタに書かれたものを取得しながらhead
は、標準出力を取得します。
((ps aux | while read -r LINE ; do echo "$LINE" ; echo "$LINE" 1>&3 ; done | head -1 1>&4) 3>&1 | grep process_name) 4>&1
1のみ使用して、私はあなたが少なくとも—のために求めている何をすべきかを知っている最も一般的な方法であることあなたが見ることができるように、これは非常に扱いにくいです。なぜなら、このアプローチのフルパワーを必要としないときは、より簡単な方法をお勧めします。また、最後のものはもはやヘッダーが最初に来ることを保証しません。私のシステムでは、head
の出力はの出力の後に一貫してのように終わっているようですgrep
。 (私はhead
とgrep
コマンドの位置を入れ替えることで対処できると思いますが、これまでのところ私は知っている限り信頼できず、ちょうど今試したときに奇妙な効果があるようでした。)
これはうまく見えます。それ以外の回答がない場合、私はそれを受け入れます。しかし、出力を2つ以上のプロセスに分割し、後で出力をマージしたい場合もあります。私はそれを行うためにいくつかのBASHの方法があるのだろうかと思います。 –
@icando:出力を2つ以上のプロセスに分割するオプションを含め、いくつかのオプションを追加しました。 。 。それは混乱のようなものです! – ruakh
これは素晴らしいです! –