`ps`의 출력을 다른 필드로 구문 분석하는 방법은 무엇입니까?

`ps`의 출력을 다른 필드로 구문 분석하는 방법은 무엇입니까?

psget any field 를 사용하기 위해 출력을 구문 분석하고 싶습니다 awk. 필드가 공백으로 구분되어 있는 것처럼 보이지만 ps필드의 값에는 COMMAND공백이 있는 경우가 많습니다.

ps출력에 고유한 필드 구분 기호를 사용 하도록 지시하는 방법이 있습니까 ? 맨페이지에서 하나도 찾지 못했습니다 ps.

그렇지 않은 경우 현장에서 값을 얻으려면 어떻게 해야 합니까? 감사해요.

답변1

형식 문자열 매개변수를 사용할 때 고유한 필드 구분 기호를 명시적으로 지정할 수 있습니다.인쇄()사용자 정의 출력 스타일:

$ ps -o '%p,%a,%c,%y'
  PID,COMMAND                    ,COMMAND        ,TTY
15742,ps -o %p,%a,%c,%y          ,ps             ,pts/6
24719,-su                        ,bash           ,pts/6

답변2

먼저 여러 공백을 단일 공백(또는 다른 문자)으로 바꿀 수 있습니다. 바라보다이 문제이를 달성하는 방법에 대해. 다음으로 이를 사용 cut하여 원하는 열을 선택할 수 있습니다. 당신은 또한 볼 수 있습니다이 문제.

답변3

read쉘이 나머지 모든 필드를 마지막 변수에 넣고 마지막에 COMMAND를 인쇄한다는 사실을 활용할 수 있습니다 .

ps -eo pid,cmd,tty,args | while read PID CMD TTY ARG; do echo $PID $CMD $TTY $ARG; done

출력을 직접 읽을 때 에 전달하거나 $ARG... 내부 에 awk연결할 수 있습니다.$4$NFawkps

답변4

모든 것을 최대로 채운 다음 "많은 공백"을 구분 기호로 처리하고 파이프 또는 다른 문자로 변경하여 더 제정신으로 만들 수 있습니다. 다음은 일반적으로 수행하는 작업 을 --format수행 -f하고 구분 기호를 변경하고 -Z공백을 포함할 수 있는 또 다른 필드인 "탭"(일반적으로 수행하는 작업)을 추가하여 공백을 끝으로 이동하는 것만으로는 충분하지 않음을 보여줍니다.

ps -e --format "label:200 uid:200 pid:200 ppid:200 c:200 stime:200 tty:200 time:200 command:200" \
    | sed -r 's| {100,}|\||g'

그러나 이것은 부작용이 있을 수 있습니다... 내 컴퓨터에서 허용되는 패딩에 대한 제한 ps는 100에서 200 사이인 것 같습니다. 다른 곳에서는 다를 수도 있습니다. 어쩌면 하나의 명령에 너무 많은 공백이 있을 수도 있습니다. 이것이 항상 작동한다는 보장은 없습니다. (무인 스크립트와 같이) 보장이 필요한 경우 기본적으로 ps를 다시 구현해야 합니다. 즉, /proc/[0-9]*이 모든 정보를 수집하려면 직접 찾아보아야 합니다 .

관련 정보