次のコマンドを実行します。
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 for
replace with
options
- 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 ])'
抽出したいパラメータにスペースが含まれていない場合は機能します。