변수에 할당된 하위 문자열 가져오기

변수에 할당된 하위 문자열 가져오기
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'

이는 모든 디렉터리 이름에 적용됩니다.

답변2

pgreppid를 찾는 데 사용됩니다 /proc/$PID/cmdline.

var=$(
pgrep -f "component_events.xml" | \
    xargs -I{} sh -c "head -z -n1 /proc/{}/cmdline | tr '\0' '\n'" | \
    xargs -n1 dirname
)

이는 명령 경로에 매개변수가 있고 여러 PID가 발견된 경우에도 작동합니다.


설명하다:

검색 PID:

pgrep -f "component_events.xml"

발견된 각 PID에 대해 전체 명령( /proc/PID/cmdline)을 가져오지만 인수( ) 없이 명령만 인쇄합니다 head -z -n1.

xargs -I{} sh -c "head -z -n1 /proc/{}/cmdline

그런 다음 후행 \0개행 문자( \n)를 바꿉니다.

tr '\0' '\n'"

디렉토리 이름만 출력:

xargs -n1 dirname

관련 정보