서버에서 많은 Java 프로세스가 실행되고 있으며, 이는 개발 서버이므로 여러 환경이 실행되고 있습니다.
특정 환경에 대한 프로세스를 나열하려는 경우 java 명령이 매개변수가 많아 꽤 길기 때문에 읽을 수 있는 짧은 목록을 제공하기 위해 이 작업을 수행합니다.
ps -ef|grep ENV-NAME|grep -v grep|awk '{print $2 " " $32}'
그러면 실행 중인 Java 클래스의 프로세스 ID와 이름이 인쇄됩니다.
그러나 아시다시피 이는 항상 동일한 열(32)에 있는 Java 클래스 이름에 의존합니다.
프로세스 중 하나에 매개변수를 추가하면 분명히 잘못된 열이 선택되고 프로세스 목록이 더 이상 의미가 없습니다.
Java 클래스 이름은 항상 com.company.start.name
.
열 번호 대신 정규식을 사용하여 올바른 열을 선택하기 위해 awk에서 이 정보를 사용할 수 있습니까?
답변1
정규식을 기반으로 정확하게 열을 선택할 수는 없지만 다음과 같이 할 수 있습니다.
ps -ef | awk ' /[E]NV-NAME/{ match($0, /[a-z]+\.[a-z]+\.[a-z]+\.[a-z]+/); print( $2 " " substr($0, RSTART, RLENGTH)) }'
가독성을 높이기 위해 grep을 제거하고 여러 줄로 변경했습니다. 이 모든 것을 함수에 캡처하고 싶을 수도 있습니다.
추신: 저는 또한 awk 정규식을 처음 접했기 때문에 이 설명을 개선할 수 있을 것입니다 match
.
PPS 이 [E]NV-NAME
구문은 정규식이 ps
출력에서 자체적으로 일치하는 것을 방지하는 편리한 지름길입니다. grep
아이러니하게도 이 특정 작업에는 실제로 필요하지도 유용하지도 않습니다.