2012-03-23 8 views
0

背景:ときどきプロセスの統計情報を把握するのにps aux | grep process_nameを使用します。しかし、私はps出力のヘッダーを覚えていません。だから私は実行する必要があります。出力を2つのプロセスにリダイレクトしてマージする

ps aux | tee 1.txt | grep process_name > 2.txt 
cat 1.txt | head -1 | cat - 2.txt 

だから私の質問です:2つの一時ファイルなしでこれを達成するための方法があり、そして好ましくはコマンドの1行の代わりに、2つの行を使用して?

答えて

2

最も簡単な方法は、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。 (私はheadgrepコマンドの位置を入れ替えることで対処できると思いますが、これまでのところ私は知っている限り信頼できず、ちょうど今試したときに奇妙な効果があるようでした。)

+0

これはうまく見えます。それ以外の回答がない場合、私はそれを受け入れます。しかし、出力を2つ以上のプロセスに分割し、後で出力をマージしたい場合もあります。私はそれを行うためにいくつかのBASHの方法があるのだろうかと思います。 –

+0

@icando:出力を2つ以上のプロセスに分割するオプションを含め、いくつかのオプションを追加しました。 。 。それは混乱のようなものです! – ruakh

+0

これは素晴らしいです! –

1

それとも、私はそれを見ずにPerlやawkのを覚えていることはありませんので、:

ps aux | head -n 1 && ps aux |grep process_name 
+0

これはこの場合には動作しますが、 'ps aux'ではなく、2回実行できない他のコマンドや2回の実行で異なる結果が得られるのでしょうか? –

+0

「2度は実行できません」と言ったときの意味は分かりません。最初の部分が失敗した場合は、どういう意味ですか?最初の部分の目的は、ヘッダーを吐き出すことです(lsofのようなものでも動作するはずです)。何かが見つからない限り、失敗しないはずです... – rutgersmike

1

別の汚いトリックはヘッダが'USER'から始まることを覚えると

ps aux | grep -E 'USER | process_name' 

これはまた意志を行うことですgrepコマンド自体を表示してください:)

+0

...または 'ps aux | grep -E '^ USER | 。{40、} process_name'' ...これはユーザ名で始まるので、偽の他の行を打つべきではありません。 USERという名前のユーザーがいない限り。 。{40、}は(私が知っているどんな 'psでも)プロセスで名前が一致するユーザーに対して誤認を犯すべきです(COMMAND列は常に私の経験では40列目にあります) – BRFennPocock

1

または

ps aux | egrep "(^USER +PID)|^process_name" 
1

sedが正確に何をしたいでしょう:

ps aux | sed -n -e '1 p; /PROCESS_NAME/p' 

sedコマンドライン:

  -n印刷のみ指定した行
  -e次のスクリプト
  1 pは、最初の印刷実行ライン

1

を含む
  /PROCESS_NAME/p印刷行は、私はこれが唯一のLinux上では動作しません願ってい-C

ps u -C java -C totem 
USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
stefan 16878 0.1 10.5 429036 107868 pts/7 Sl+ 12:51 0:24 /opt/java/bin/java -Xmx256M -Xms32M -Xbootclasspa 
stefan 25791 0.5 3.8 202800 38984 ?  Sl 17:45 0:16 totem file:///home/stefan/Desktop/scala/dritte/dl 

とプロセスの名前(複数可)を使用;コマンドセパレータ。 :)

私はいつも多くの人々がpsというオプションを知っていない(または使用していない)人がいないことを知りました。それは常にps | grep xです。 :)

関連する問題