ps出力をヘッダーでgrepする方法


26

ヘッダーを配置したPS出力をgrepするにはどうすればよいですか?

これらの2つのプロセスにより、サーバーで実行されるアプリが構成されます。

root     17123 16727  0 16:25 pts/6    00:00:00 grep GMC
root     32017     1 83 May03 ?        6-22:01:17 /scripts/GMC/PNetT-5.1-SP1/PNetTNetServer.bin -tempdir /usr/local/GMC/PNetT-5.1-SP1/tmpData -D

6-22:01:17それは6日間実行されていますことを意味ですか?プロセスが実行されている時間の長さを判断しようとしています...

2列目はプロセスIDですか?だから私がkill 32017それを行うと、2番目のプロセスを殺すでしょうか?

回答:


37
ps -ef | egrep "GMC|PID"

「GMC」をps交換し、必要に応じて切り替えます。

出力例:

root@xxxxx:~$ ps -ef | egrep "disk|PID"

UID        PID  PPID  C STIME TTY          TIME CMD
paremh1  12501 12466  0 18:31 pts/1    00:00:00 egrep disk|PID
root     14936     1  0 Apr26 ?        00:02:11 /usr/lib/udisks/udisks-daemon
root     14937 14936  0 Apr26 ?        00:00:03 udisks-daemon: not polling any devices

8
これが機能する「理由」に関する情報を追加するとよいでしょう。
イライジャ・リン

2
いいえ、それはユーザーの練習です。
-Hyppy

@ElijahLynnヘッダーのテキスト(この場合はPID)と一致します。しかし、あなたは... UID、PTIME、またはヘッダー内の何かのためにそれを交換でき
ベンCreasy

5
したがってps -e、すべてのプロセスを選択しps -f、列ヘッダーを表示するフルフォーマットのリストです。次に、列ヘッダーと出力をegrepにパイプします。egrepはgrepを拡張したものであり、パイプ|にOR(this OR that)という特別な意味を持たせることができます。したがって、最終的に列ヘッダーのPIDと重要な出力行を一致させることになります。
イライジャリン

Ubuntu 16.04のegrep / grep -Eコマンドで単純な引用符を使用する必要がありました。例: ps -ef | grep -E 'GMC|PID'
-Vlax

13

geekosaurのおかげで、個別のコマンドではなく、このコマンドを要求に使用したいと思います。

ps -ef | head -1; ps -ef | grep "your-pattern-goes-here"

扱いにくいのは、「;」を使用することです コマンドをチェーンするためにシェルでサポートされています。


これは、受け入れられている答えよりもクリーンで堅牢です。ヘッダーにPIDがあると断言することも、grep文字列に複雑さを加えることもありません。
7yl4r

2
ああ待って...あなたはps -ef繰り返しを持っている。さらに良いps -ef | { head -1 ; grep "your-pattern" ; }
-7yl4r

@ 7yl4rはそのシェル機能を使用しませんでした。改善されたコマンドを試してみましたが、完全に機能します!ガットは、学んだ:)
ヴィック・ラウ

3
他人の好奇心のための「グループ化コマンド」と呼ばれるこの技術は約発見の説明を参照してください:gnu.org/software/bash/manual/html_node/Command-Grouping.html
ヴィック・ラウ

@ 7yl4r素晴らしいテクニック!コマンドを繰り返さない方法を探していました。グループ化されたコマンドをパイプすることもできますps -ef | { head -1; grep "pattern" | head -5; }。パターンgrep-edの結果が多い場合に便利です!
中毒

6

2列目はプロセスIDです。4番目は、プロセスが作成されたときです(これは通常、プログラムが開始された時間ですが、常にではありません;考慮execve()してください); 6番目は消費されるCPU時間です。そのため、8日間実行され、ほぼ7日間のCPU時間を使用しましたが、これは気になると思います。

同じ呼び出しでヘッダーを取得するのは、せいぜいトリッキーです。私は別のことをするだけですps | head -1。の代わりにpsの独自の選択メソッドまたはのようなものを使用することを検討できます。これは、実際にヘッダーを渡すようには設計されていません。pgrepgrep


なに83
ウェブネット

現在のプロセスの優先度。過去のCPUとI / Oの使用量、およびユーザーまたはシステムが割り当てたnice値に基づきます。数字が小さいほど優先度が高くなります。この場合、grepディスク読み取りでブロックされ、出力を書き込むPNetTNetServer.binために譲歩されたため、優先度0であり、ブロックせずにタイムスライスを一貫して使用するため、大きい数値です。(スケジューリングは複雑で、詳細は使用されている正確なスケジューラーに依存します。)
geekosaur

5

egrepソリューションはシンプルで便利ですが、もちろん、「PID」(ただし、合理的な仮定よりも)と同じ文字列が常に含まれているヘッダーに依存しています。私はこれであなたのニーズには十分だと思いますが、誰かが代替を望んでいる場合にはsedがあります。

Sedでは、「最初の行を印刷してから、パターンを含む行を印刷する」と言うだけです。例えば:

ps auxwww | sed -n '1p; /PROCESS_NAME_TO_SEARCH/p;'

/sed -n/d;sed自体をフィルターに追加します。

ps auxwww | sed -n '1p; /sed -n/d; /PROCESS_NAME_TO_SEARCH/p;'

/sed -n/d正しくありません。既存のコマンドにはsed -n、印刷したいが含まれている場合があります。トリックは使用することsed -n '1p; /[P]ROCESS_NAME_TO_SEARCH/p'です。;-) []検索文字列内の文字に注意してください。
-anishsane

4

より簡単な代替手段: ps -ef | { head -1; grep GMC; }

ヘッダーを表示する行数で数値を置き換えます。


1
私はこのアプローチが好きですが、コマンドには最後に別のセミコロンが必要です。ps -ef | { head -1; grep GMC; }。また、私は次のような関数でそれが好きですfunction pgrep() { ps -ef | { head -1; grep $@; } }
ブレット

1

pgrepでpidを取得できます

pgrep PNetTNetServer

そして、psをpidとともに使用します

ps u 12345

または、2つを1つのコマンドに結合します

ps u `pgrep PNetTNetServer`

これにより、必要な行だけが表示され、ヘッダーが含まれます。


0

印刷する小さなPerlプログラムを書きました

  • 最初の行と一致するすべての行(一致する場合)、または
  • 一致するものがない場合は何もありません。

私はほとんどの場合、のようps | 1andre GMCに使用しますが、ファイル引数を取ることもできます(各ファイルは、そのファイルの行で行われた一致に対して独自のヘッダー行を提供します)。



#!/usr/bin/perl

#
# 1andre <regexp> [<file> ...]
#
#   1 -           first ({1}st)
# and -                  {and}
#  re - (lines matching) {re}gexp
#
# If no <files> are given (or "-" is given as a <file>) stdin is
# used.
#
# If any lines from each <file> match the <regexp>, print the
# first line from that <file> and all the matching lines from
# that <file>.
#

use strict;
use warnings;

if(scalar @ARGV < 1) {
  printf STDERR "usage: %s <regexp> [<file> ...]\n", $0;
  exit 1;
}

my $re = shift;
my $header;

while(<>) {
  if($. == 1) {
    $header = $_;
  } elsif(m/$re/) {
    if(defined $header) {
      print $header;
      undef $header;
    }
    print;
  }
} continue {
  # close resets $. when we get to the end of each file that <> is processing
  close ARGV if eof;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.