sedを使用してpsから空白で区切られたリストでPIDをフィルタリングして抽出します。

sedを使用してpsから空白で区切られたリストでPIDをフィルタリングして抽出します。

出力をフィルタリングしてフォーマットしたいのですが、ps -ax -o pid,commandどのパイプを使用するのかわかりません。

固定位置で固定文字列に一致する行をフィルタリングし、一致する行のpidを保持し、スペースで区切られたリスト(例:1234 5678 33121

を使用して最初のステップを簡単に実行できますが、| egrep 'regex'2番目のステップにはsedまたは他のものが必要な場合があり、理解できません。 sed(およびawk)も正規表現フィルタリングを処理するため、おそらくgrepは必要ありません。

複数の空白文字は大丈夫で、ソート順は重要ではないため、PIDを切り捨てたり、行をソートする必要はありません。例:

$ ps -ax -o pid,command

  PID COMMAND
    0 [kernel]
    1 /sbin/init --
...
  255 /usr/local/sbin/check_status
  268 /sbin/devd -q
 1435 (unlinkd) (unlinkd)
 1974 sleep 60
 7414 /bin/sh /var/db/test/update.sh
21848 ps -ax -o pid,command
39207 /usr/local/sbin/syslog-ng -p /var/run/syslog-ng.pid

matching /usr/ in chars 7-11コマンドが/usr/(行や正規表現など)で始まるすべてのプロセスを見つけ、空白で区切られ^[0-9 ]{5}\s\/usr\/た1行に対応するpid(または)を返します。first 5 chars出力:

255 39207   (no \n's, amount of spacing unimportant).

試してみましたが、sedはわかりやすいコマンドではありません。どうすればいいですか?

答え1

pidのすべての数値を取得するには、pgrep次のようにしてこれを実行できます。

pgrep -d " " -f ^/usr

コマンドで始まるプロセスのすべてのPIDを含むスペースで区切られたリストを印刷します。/usr

ps本当にそのコマンドを使用したい場合は、目的の操作を実行するよりもawkこれがより良いツールになります。sedPIDの最初の5文字のみを使用してこれを実行できます。たとえば、次のようになります。

ps -ax -o pid,command | awk '$2 ~ /^\/usr/ {printf( "%s ", substr($1,0,5));} END {print ""}'

2番目のフィールドがで始まることを確認してください/usr。もしそうなら、最初のフィールドの最初の5文字を​​印刷し、その後にスペースを入れて、良い測定のために末尾に改行を追加しますが、そうでない場合は削除できます。最後にも改行したくありません。

Gilesが指摘したように、実際にはPIDの最初の5文字しか望まないかもしれません(質問を誤って読んだかもしれません)。したがって、より便利な答えは次のとおりawkです。

ps -ax -o pid,command | awk '$2 ~ /^\/usr/ {printf( "%d ", $1);} END {print ""}'

関連情報