ps
get 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
답변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
$NF
awk
ps
답변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]*
이 모든 정보를 수집하려면 직접 찾아보아야 합니다 .