14

つまり、特定の ps コマンドを使用します

ps -p <pid> -o %cpu, %mem

次のような結果が得られます

 %CPU %MEM
 15.1 10.0

私がやりたいのは、ヘッダーなしで 15.1 や 10.0 のようなこれらの番号を印刷することだけです。「カット」を使ってみました。しかし、それはすべての行で機能するようです。

すなわち

echo "$(ps -p 747 -o %cpu,%mem)" | cut -c 1-5

のようなものを与える

 %CPU
  8.0

ヘッダーなしで数字だけを取得する方法は?

4

5 に答える 5

29

GNUに相当するBSD(およびより一般的にはPOSIX)ps --no-headersは少し面倒ですが、manページから:

 -o      Display information associated with the space or comma sepa-
         rated list of keywords specified.  Multiple keywords may also
         be given in the form of more than one -o option.  Keywords may
         be appended with an equals (`=') sign and a string.  This
         causes the printed header to use the specified string instead
         of the standard header.  If all keywords have empty header
         texts, no header line is written.

そう:

ps -p 747 -o '%cpu=,%mem='

それでおしまい。

任意のコマンドから最初の行を削除する必要がある場合は、tail を使用すると簡単に削除できます。

ps -p 747 -o '%cpu,%mem' | tail +2

または、完全に移植可能にしたい場合は、次のようにします。

ps -p 747 -o '%cpu,%mem' | tail -n +2

このcutコマンドは、単純な行ベースのコマンドheadtail. (本当に列を切り取りたい場合はうまくいきます…しかし、この場合はおそらくそうではありません。-o余分なものを渡してそれらを切り取ろうとするよりも、最初に ps に必要なパラメーターを渡す方がはるかに簡単です.)

一方、エコーの引数として何かを eval する必要があると考える理由がわかりません。これは、直接実行するのと同じ効果があり、物事をより複雑にするだけです。たとえば、次の 2 行は同等です。

echo "$(ps -p 747 -o %cpu,%mem)" | cut -c 1-5
ps -p 747 -o %cpu,%mem | cut -c 1-5
于 2012-07-18T00:16:46.730 に答える
8

使用awk:

ps -p 747 -o %cpu,%mem | awk 'NR>1'

使用sed:

ps -p 747 -o %cpu,%mem | sed 1d
于 2012-07-17T23:22:36.100 に答える
8

使用ps --no-headers:

--no-headers print no header line at all

または使用:

ps | tail -n +2
于 2012-07-17T23:45:35.230 に答える
4

すでに勝者を選んでいます。ドラッツ...

パラメーターを既に使用している場合は-o、名前と列名の後に等号を付けて、印刷する特定の列の見出しを指定できます。null 文字列を入れると、見出しは出力されません。

(あなたが持っていたように)標準的な見出しで:

$ ps -p $pid -o%cpu,%mem
 %CPU %MEM
  0.0  0.0

カスタム見出しを使用する (仕組みを説明するためだけに):

$  ps -p $pid -o%cpu=FOO,%mem=BAR
  FOO  BAR
  0.0  0.0

見出しがヌルの場合 (空白行も出力されないことに注意してください):

$ ps -p $pid -o%cpu="",%mem=""
 0.0   0.0
于 2012-07-18T00:20:20.287 に答える