bash-4.1$ ps -ef|grep component_events.xml
gdxx1122 1190 1181 0 Mar25 ? 00:00:00 /xx1122/fmw/product/111/ohs_111/ohs/bin/odl_rotatelogs -l -h:/xx1122/admin/xx1122_vmabcd123/config/OHS/ohs1/component_events.xml_ohs1
/xx1122/admin/xx1122_vmabcd123/auditlogs/OHS/ohs1/audit-pid1181-%Y%m%d%H%M%S.log 1M 4M
gdxx1122 19885 19205 0 08:05 pts/1 00:00:00 grep component_events.xml
上記のコマンドをスクリプトで実行すると、「/xx1122/admin/xx1122_vmabcd123/config/OHS/ohs1」が抽出され、変数に割り当てられます。上記の出力はサーバーごとに異なる可能性があるため、動的でなければなりません。開始文字列xx1122は動的に渡されなければなりません。
ベストアンサー1
POSIXlyを使用してくださいsed
:
var=$(
ps -Ao args= | sed -n 's|.* -h:\(.*\)/component_events\.xml.*|\1|p'
)
/component_events.xml
実際、これは最後の発生と前の最後の発生の間のコマンドライン部分を返します-h:
。
したがって、コマンドラインが次のような場合:
... -h:x/component_events.xml -g:y/component_events.xml
x/components_events.xml -g:y
あなたは代わりに得るでしょうx
。
これを防ぐために変更できますが、sed -n 's|.* -h:\([^ ]*\)/component_events\.xml.*|\1|p'
スペース文字を含むディレクトリ名には機能しません。
最新のGNU / Linuxシステムでは、次のこともできます。
LC_ALL=C grep -zhPo '^-h:\K.*(?=/component_events\.xml)' /proc/*/cmdline |
tr '\0' '\n'
これはすべてのディレクトリ名に適用されます。