실행 중인 Java 버전의 경로만 표시하기 위해 grep에 대한 정규식을 작성하는 데 도움이 필요합니다.

실행 중인 Java 버전의 경로만 표시하기 위해 grep에 대한 정규식을 작성하는 데 도움이 필요합니다.

Java 경로만 반환하려면 ps -ef에서 grep을 작성하는 데 도움이 필요합니다.

다음과 같은 실행 프로세스가 있다고 가정해 보겠습니다.

bash> ps -ef | grep java
user  pid#      1  1 00:00 ?        00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc.

내가 여기서 나온 것은 다음을 표시하는 것입니다.

bash> ps -ef | grep 'some regex or pattern here'
/path/to/java/jdk_1.8/bin/java

모두 감사합니다.

답변1

grep -oP "/.*?/bin/java"발견된 첫 번째 슬래시부터 시작하여 /bin/java가 처음 나타날 때까지 일치시키려고 시도하는 것은 어떻습니까 ? 대문자 P는 grep에서 좋은 정규식 지원을 얻습니다.

또는 이것은 grep에도 -P가 필요하지 않습니다. grep -oP "/.*/bin/java"첫 번째 슬래시부터 시작하여 /bin/java까지의 모든 문자와 최대한 일치합니다.

그리고 처음부터 직접 해결해야 한다면 정규식에 대해 아는 것 외에도 에코를 사용하여 빠르게 테스트할 수 있습니다. 예를 들어 echo user pid# 1 1 00:00 ? 00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc. | grep패턴을 시도해 볼 수 있습니다. 그리고 -i를 -o와 혼합하여 -io와 함께 grep egor에 추가하면 대소문자를 구분하지 않게 만들 수 있습니다(-i의 기능).

참고- 위의 내용은 괜찮지만 정규 표현식이나 기술에 관심이 있다면 .*blah약간 흥미롭습니다. .*(탐욕스러운 평가이므로) 어쩌고 저쩌고 5번 하면 일치할 수 있기 때문입니다. ㅋㅋㅋ 5번. 4에서 .*마지막은 어쩌구. .*?blah첫 번째 어쩌구까지 모든 문자와 일치하는 (게으른 평가) 가 있습니다 . 하지만 -P가 필요합니다. 그러나 /bin/java를 찾는 경우 /bin/java를 한 줄에 여러 번 얻지 않으므로 .*? 없이 를 사용하는 것은 큰 문제/문제가 아닙니다.

답변2

ps원하지 않는 많은 정보를 인쇄한 다음 복잡한 grep표현식을 사용하여 원하는 정보를 추출 해야 한다는 것은 나에게는 다소 어리석은 것 같습니다.하다원하다. 다음이 더 나은 접근 방식인 것 같습니다.

ps -C java -o cmd=

그러면 명령의 인수 목록이 제공되지만 sed필터를 사용하여 인수 0으로 정리할 수 있습니다.

ps -C java -o cmd= | sed 's%\(/java\) .*$%\1%'

거의 확실하게 경로에 공백이 없으면 java훨씬 간단한 필터를 사용할 수 있습니다.

ps -C java -o cmd= | sed 's/ .*$//'

(실제로 $"탐욕스러운" 일치는 줄 끝까지의 모든 문자를 포함하기 때문에 생략할 수 있습니다. 그러나 일반적으로 가독성을 위해 포함하는 것도 좋습니다.)

관련 정보