ps 명령에서 키 값 쌍을 추출하는 방법

ps 명령에서 키 값 쌍을 추출하는 방법

ps다음과 같은 명령 에서 애플리케이션 이름을 추출하려고 합니다 .

ps -af -u sas |grep "java"| grep -v "grep"

그리고 다음을 생성합니다.

sas 24431     1  0 Oct10 ?        00:51:08 /usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs

사용해 보았지만 egrep작동하지 않는 것 같습니다.

ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"

"myApp" 값만 얻으려면 어떻게 해야 합니까 -Dapp.name?

답변1

현재 나타나는 오류 메시지가 표시되지 않지만 아마도

grep: 알 수 없는 장치 방법

그 이유는 모든 또는 적어도 대부분의 다른 명령줄 프로그램과 마찬가지로 grepa로 시작하는 모든 항목을 옵션으로 가정 -하고 그렇게 구문 분석하려고 하기 때문입니다. 이 경우 장치 파일을 처리하는 방법을 -D지시하는 데 사용됩니다 ( 자세한 내용은 참조). 이 문제를 해결하는 한 가지 방법은 다음 항목이 옵션 플래그가 아님을 알려주는 것을 사용하는 것입니다.grepman grep--grep

이를 GNU의 PCRE 기능과 결합하면 다음을 grep수행할 수 있습니다.

ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'

정규식은 a를 검색하여 -삭제한 다음( ), 그 다음에는 공백이 아닌 문자가 가능한 한 많은 문자가 뒤에 오는 \K문자열을 삭제 합니다. Dapp.name=출력은 다음과 같습니다

Dapp.name=myApp

myApp해당 부분을 변수에 저장 하려면 해당 부분만 검색하겠습니다.

ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+'

변수에 할당하려면:

$ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')"
$ echo $app
myApp

그러나 이런 종류의 결과는 절대로 grep출력 해서는 안 됩니다 .pspgrep다음을 위한 것입니다:

app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"

답변2

와 함께 awk:

ps -af -u sas | awk 'BEGIN {RS=" "}; /-Dapp.name/'

답변3

ps -af -u sas | sed -n '/[j]ava/s/.*-Dapp\.name=\([^ ]*\).*/\1/p'

답변4

다른 답변보다 더 복잡하지만 getopt구문 분석을 처리하는 데 사용됩니다. 또 다른 대안.

getopt -aql 'Dapp.name:' $(\
    ps -af -u sas | grep java | grep -v grep | tr -s ' ' | cut -d' ' -f8-\
) | cut -d"'" -f2
  1. 당신의 명령:ps -af -u sas | grep java | grep -v grep
  2. tr -s ' '여러 공간을 하나의 공간으로 "압축"하여cut
  3. cut -d' ' -f8-줄을 공백으로 나누고 8 이후의 모든 필드를 가져옵니다. 결과는 다음과 같습니다./usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs
  4. getopts -aql 'Dapp.name:' $(...)명령 옵션을 구문 분석하고 Dapp.name값(으로 표시됨 :)을 가진 사람과 일치하는 긴 이름만 출력합니다. 결과는 다음과 같습니다.--Dapp.name 'myApp' --
  5. cut -d"'" -f2작은 따옴표 안의 내용을 가져옵니다.
  6. 결과는 다음과 같습니다myApp

관련 정보