Linuxで実行されているプロセスの名前付きオプション値を取得するには?

Linuxで実行されているプロセスの名前付きオプション値を取得するには?

次のコマンドを実行します。

ps -e -o args | grep destiny | grep UNIX

次の出力が表示されます。

/path/to/destiny -r -m UNIX -t TCP -p 1501

-m印刷パラメータ(またはまたは-t-pの値を取得するには、どのコマンドを使用できますか?私は次の目標を達成したいと思います。

ps -e -o args | grep destiny | grep UNIX | <someCommand> -pこれは印刷する必要があります1501

ps -e -o args | grep destiny | grep UNIX | <someCommand> -mこれは印刷する必要がありますUNIX

ps -e -o args | grep destiny | grep UNIX | <someCommand> -tこれは印刷する必要がありますTCP

-pまたはは-m列を切り替えて、-t数字で列を印刷して選択できないようにすることができます。awk

事実が多いほど、解析が簡単になります。おそらくツールの知識が不足しているかもしれません。

  • オプションがない場合は空の文字列が返されます。
  • この特別な場合、解析されるオプションには常にパラメータ/値があります。

答え1

これは、コマンド自体だけが引数を解析する方法を知っているため、通常は不可能です。あなたの例を見てください:

/path/to/destiny -r -m UNIX -t TCP -p 1501

-p引数なしでオプションにすることができます(たとえば、ブール値:一部の動作を有効または無効にするなど)。この場合、1501位置引数(ファイル名など)になります。あるいは、-p引数が . の引数を持つオプションである場合もあります1501。それが何であるかを知る方法はありません!

パラメータベクトルは0個以上の文字列のリストにすぎません。これらの文字列には、オプション、そのオプションの引数、オプションではない引数を表す意味はありません。

あなたの例のオプションでさえ-r一般的に解析することはできません。-rで始まる他の文字列が続くことを考慮すると、-これはパラメータを使用しないオプション(たとえば、一部の動作を有効または無効にするブール値)である可能性が高くなりますが、-r実際には100%はわかりません。-r引数があるオプションであり、-mその引数になります。あるいは、コマンドは一般的なUNIXルールにまったく従わない可能性があり、-r単にオプションではありません!

答え2

使用方法sed

ps -e -o args | grep -e 'destiny.*UNIX' | sed -e 's/.*-t\s\([A-Z0-9]*\).*/\1/'
ps -e -o args | grep -e 'destiny.*UNIX' | sed -e 's/.*-p\s\([A-Z0-9]*\).*/\1/'
ps -e -o args | grep -e 'destiny.*UNIX' | sed -e 's/.*-m\s\([A-Z0-9]*\).*/\1/'

sed -e 's/.*-t\s\([A-Z0-9]*\).*/\1/'

  • s ///search forreplace withoptions
  • sは検索です。
  • .*は、「-t」に達するまですべての文字と一致します。
  • \ sはすべてのスペースと一致します。
  • (キャプチャを開始します。
  • [A-Z0-9]* は、すべての大文字とすべての長さの数字と一致します。
  • ) キャプチャを終了します。
  • .*はその行の残りの文字と一致します(存在する場合)。
  • \1すべてをキャプチャに置き換えます。

答え3

あなたはそれを使用することができますgrep

~$ echo "/path/to/destiny -r -m UNIX -t TCP -p 1501" | grep -oP -- '-t \K[^ ]+'
TCP
~$ echo "/path/to/destiny -r -m UNIX -t TCP -p 1501" | grep -oP -- '-p \K[^ ]+'
1501

\s(スペースの代わりにこれに似たものを使用したいかもしれませんgrep -oP -- '-p\s\K[^\s]+'。:)

-o「一致するアイテムのみを印刷」を意味すると、\K開始がリセットされます。

これは単純な場合のみ処理することに注意してください。セラダ答え)。

別の方法は、LookBehindを使用することです。

grep -oP -- '(?<=-p )[^ ]+'

答え4

これはPythonのワンライナーです。 (私はPerlとawkがリスト内の値の位置を取得する簡単な方法がないので、Pythonを使用しています。)

ps -eo args | grep '/path/to/destiny' | 
     python -c 'x=input().split(); print(x[ x.index("-p")+1 ])'

抽出したいパラメータにスペースが含まれていない場合は機能します。

関連情報