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


10

다음 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"

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


경우 grep패턴이 시작 -, 당신은 후를 둘 필요 -e옵션을 선택합니다. 그렇지 않으면 옵션으로 취급됩니다. 그러나 그것은 단어 -Dapp.name뒤에 나오는 부분 이 아니라 단어와 일치 합니다.
Barmar

교대 :grep -o -- -Dapp.name
strugee

grep [j]ava명령을 피하기 위해 사용할 수 있습니다 grep -v "grep"(bash에서 테스트 됨)
HVNSweeting

답변:



8

당신은 당신이 받고있는 오류 메시지를 표시하지 않지만 아마도

grep : 알 수없는 장치 방법

그것은 모든 또는 적어도 대부분의 다른 명령 행 프로그램 grep과 마찬가지로 a -로 시작하는 모든 것이 옵션 이라고 가정하고 그렇게 해석하려고 시도하기 때문입니다. 이 경우 장치 파일을 처리하는 방법 -D을 지시 grep하는 데 사용 됩니다 ( man 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]+')"

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

3

모든 사용 시간 ps … | grep …과 결과에서 그렙 제외 할 필요가, 당신은 잘못하고 있어요.

출력을 구문 분석하는 0 번째 규칙은 ps사용 pgrep가능한 경우 와 같이보다 안정적인 도구를 사용하는 것 입니다. pgrep가 있으면 pgrep -f java명령을 실행하는 모든 프로세스 를 나열합니다 java. 이 옵션 -l은 각 프로세스에 대한 명령 줄을 추가합니다.

의 인수를 추출하기 -Dapp.name위해 sed를 사용할 수 있습니다. 전체 라인을 일치시키고 그룹에서 흥미로운 부분을 채우고 해당 그룹을 인쇄하십시오.

pgrep -lf java | sed -n 's/^.*-Dapp\.name=\([^ ]*\).*$/\1/p'

출력을 구문 분석하는 첫 번째 규칙은 ps옵션 -o을 사용하여 필요한 필드를 선택하는 것입니다. 여기서는 명령 인수에만 관심이 있으므로 그만 인쇄하십시오.

ps -e -o args= | sed -n 's/^.*-Dapp\.name=\([^ ]*\).*$/\1/p'

3

다른 답변보다 더 복잡하지만 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:' $(...)명령 옵션을 분석하고 일치하는 경우에만 출력 longname Dapp.name(의해 표시된 값을 갖는다 :), 그 결과는이다--Dapp.name 'myApp' --
  5. cut -d"'" -f2 작은 따옴표로 물건을 움켜 잡습니다.
  6. 결과는 다음과 같습니다 myApp

0

pgrep대신 다음과 ps같이 사용 합니다 .

$ pgrep -fa java | grep -op "(<=-Dapp.name=)\w+"

일치하는 모든 프로세스를 반환 java한 다음 포함 된 프로세스 만 표시 하는 프로세스 를 필터링합니다 -Dapp.name=. 마지막 비트 \w+에는 공백이 없다고 가정하면 프로그램 이름이 표시됩니다.

참고 :-P 로 전환 grep입대 사용하는 것을 지정할 수있는 기능 PCRE를 - 펄 호환 정규 표현식 . 모든 버전의 grep지원은 아니지만 대부분 최신 버전의 Linux에 포함되어 있습니다.

전체 키 / 값 출력을 원하면 다음과 같이 변경하십시오.

$ pgrep -fa java | grep -oP -- "-Dapp.name=\w+"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.