정규식을 사용하여 awk 열을 선택하는 방법은 무엇입니까?

정규식을 사용하여 awk 열을 선택하는 방법은 무엇입니까?

서버에서 많은 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아이러니하게도 이 특정 작업에는 실제로 필요하지도 유용하지도 않습니다.

관련 정보