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" 값만 얻으려면 어떻게 해야 합니까 ?
답변1
받은 오류 메시지는 표시되지 않지만 그럴 수도 있습니다.
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
것을 출력 해서는 안됩니다 .ps
pgrep
사용:
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
- 당신의 명령:
ps -af -u sas | grep java | grep -v grep
tr -s ' '
여러 공간을 하나로 "압착"하여 준비cut
cut -d' ' -f8-
줄을 공백으로 나누고 8(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
getopts -aql 'Dapp.name:' $(...)
명령 옵션을 구문 분석하고Dapp.name
값이 있는 사람과 일치하는 긴 이름( 로 표시됨) 만 출력하면:
결과는 다음과 같습니다.--Dapp.name 'myApp' --
cut -d"'" -f2
작은따옴표로 콘텐츠 가져오기- 결과 :
myApp