出力をフィルタリングしてフォーマットしたいのですが、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
これがより良いツールになります。sed
PIDの最初の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 ""}'