Linux에서 실행 중인 프로세스의 명명된 옵션 값을 얻는 방법은 무엇입니까?

Linux에서 실행 중인 프로세스의 명명된 옵션 값을 얻는 방법은 무엇입니까?

다음 명령을 실행합니다.

ps -e -o args | grep destiny | grep UNIX

다음 출력이 나타납니다.

/path/to/destiny -r -m UNIX -t TCP -p 1501

-m인쇄 매개변수(예: 또는 -t또는 -p) 의 값을 얻으려면 어떤 명령을 사용할 수 있습니까 ? 나는 다음과 같은 목표를 달성하고 싶다.

ps -e -o args | grep destiny | grep UNIX | <someCommand> -p이것은 인쇄되어야합니다1501

ps -e -o args | grep destiny | grep UNIX | <someCommand> -m이것은 인쇄되어야합니다UNIX

ps -e -o args | grep destiny | grep UNIX | <someCommand> -t이것은 인쇄되어야합니다TCP

, -p또는 -m는 열을 전환하여 -t숫자로 열을 인쇄하고 선택할 수 없도록 할 수 있습니다.awk

사실이 많을수록 구문 분석이 더 쉬워집니다. 아마도 도구 지식이 부족한 것일 수도 있습니다.

  • 옵션이 없으면 빈 문자열이 반환됩니다.
  • 이 특별한 경우 구문 분석될 옵션에는 항상 매개변수/값이 있습니다.

답변1

이는 명령 자체만이 인수를 구문 분석하는 방법을 알고 있기 때문에 일반적으로 불가능합니다. 당신의 예를 들어보세요:

/path/to/destiny -r -m UNIX -t TCP -p 1501

-p인수 없이 옵션일 수 있습니다(예: 부울: 일부 동작을 활성화하거나 비활성화함). 이 경우 1501위치 인수(예: 파일 이름 등)가 됩니다. 또는 -p인수가 .인 인수가 있는 옵션일 수도 있습니다 1501. 그것이 무엇인지 알 방법이 없습니다!

매개변수 벡터는 0개 이상의 문자열 목록일 뿐입니다. 이러한 문자열에는 옵션, 해당 옵션에 대한 인수, 옵션이 아닌 인수를 나타내는 의미가 없습니다.

귀하의 예에 있는 옵션조차도 -r일반적으로 구문 분석할 수 없습니다. -r로 시작하는 다른 문자열이 뒤에 오는 것을 고려하면 -이는 매개 변수를 사용하지 않는 옵션(예: 일부 동작을 활성화하거나 비활성화하는 부울)일 가능성이 높지만 -r실제로는 100% 확실하지 않습니다. -r인수가 있는 옵션일 수 있으며 -m해당 인수가 됩니다. 또는 명령이 일반적인 UNIX 규칙을 전혀 따르지 않을 수 있으며 -r단순히 옵션이 아닙니다!

답변2

사용하는 방법 sed:

ps -e -o args | grep -e 'destiny.*UNIX' | sed -e 's/.*-t\s\([A-Z0-9]*\).*/\1/'
ps -e -o args | grep -e 'destiny.*UNIX' | sed -e 's/.*-p\s\([A-Z0-9]*\).*/\1/'
ps -e -o args | grep -e 'destiny.*UNIX' | sed -e 's/.*-m\s\([A-Z0-9]*\).*/\1/'

sed -e 's/.*-t\s\([A-Z0-9]*\).*/\1/'

  • s ///search forreplace withoptions
  • s는 검색입니다.
  • .*는 "-t"에 도달할 때까지 모든 문자와 일치합니다.
  • \s는 모든 공백과 일치합니다.
  • (캡쳐를 시작합니다.
  • [A-Z0-9]*는 모든 대문자와 모든 길이의 숫자와 일치합니다.
  • ) 캡처를 종료합니다.
  • .*는 해당 줄의 나머지 문자와 일치합니다(있는 경우).
  • \1 모든 것을 캡처로 바꿉니다.

답변3

당신은 그것을 사용할 수 있습니다 grep:

~$ echo "/path/to/destiny -r -m UNIX -t TCP -p 1501" | grep -oP -- '-t \K[^ ]+'
TCP
~$ echo "/path/to/destiny -r -m UNIX -t TCP -p 1501" | grep -oP -- '-p \K[^ ]+'
1501

\s( 공간 대신에 이와 유사한 것을 사용하고 싶을 수도 있습니다 grep -oP -- '-p\s\K[^\s]+'. :)

-o"일치하는 항목만 인쇄"를 의미하면 \K시작이 재설정됩니다.

이는 간단한 경우만 처리한다는 점에 유의하세요.세라다답변).

또 다른 방법은 LookBehind를 사용하는 것입니다.

grep -oP -- '(?<=-p )[^ ]+'

답변4

이것은 Python 원 라이너입니다. (나는 Perl과 awk가 목록에서 값의 위치를 ​​얻는 쉬운 방법이 없기 때문에 Python을 사용하고 있습니다.)

ps -eo args | grep '/path/to/destiny' | 
     python -c 'x=input().split(); print(x[ x.index("-p")+1 ])'

추출하려는 매개변수에 공백이 포함되어 있지 않으면 작동합니다.

관련 정보