![실행 중인 Java 버전의 경로만 표시하기 위해 grep에 대한 정규식을 작성하는 데 도움이 필요합니다.](https://rvso.com/image/1493939/%EC%8B%A4%ED%96%89%20%EC%A4%91%EC%9D%B8%20Java%20%EB%B2%84%EC%A0%84%EC%9D%98%20%EA%B2%BD%EB%A1%9C%EB%A7%8C%20%ED%91%9C%EC%8B%9C%ED%95%98%EA%B8%B0%20%EC%9C%84%ED%95%B4%20grep%EC%97%90%20%EB%8C%80%ED%95%9C%20%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%84%20%EC%9E%91%EC%84%B1%ED%95%98%EB%8A%94%20%EB%8D%B0%20%EB%8F%84%EC%9B%80%EC%9D%B4%20%ED%95%84%EC%9A%94%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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/ .*$//'
(실제로 $
"탐욕스러운" 일치는 줄 끝까지의 모든 문자를 포함하기 때문에 생략할 수 있습니다. 그러나 일반적으로 가독성을 위해 포함하는 것도 좋습니다.)