sed를 사용하여 ps에서 공백으로 구분된 목록으로 PID를 필터링하고 추출합니다.

sed를 사용하여 ps에서 공백으로 구분된 목록으로 PID를 필터링하고 추출합니다.

출력을 필터링하고 형식을 지정하고 싶지만 ps -ax -o pid,command어떤 파이프를 사용해야 할지 잘 모르겠습니다.

고정 위치에서 고정 문자열과 일치하는 행을 필터링하고 일치하는 행의 pid를 유지하고 공백으로 구분된 목록(예: 1234 5678 33121.

을 사용하여 첫 번째 단계를 쉽게 수행할 수 있지만 | egrep 'regex'두 번째 단계에는 sed 또는 다른 것이 필요할 수 있으며 이해할 수 없습니다. sed(및 awk)도 정규식 필터링을 처리하므로 아마도 grep이 필요하지 않을 것입니다.

여러 개의 공백 문자는 괜찮고 정렬 순서는 중요하지 않으므로 PID를 자르거나 행을 정렬할 필요가 없습니다. 예:

$ ps -ax -o pid,command

  PID COMMAND
    0 [kernel]
    1 /sbin/init --
...
  255 /usr/local/sbin/check_status
  268 /sbin/devd -q
 1435 (unlinkd) (unlinkd)
 1974 sleep 60
 7414 /bin/sh /var/db/test/update.sh
21848 ps -ax -o pid,command
39207 /usr/local/sbin/syslog-ng -p /var/run/syslog-ng.pid

matching /usr/ in chars 7-11명령이 /usr/(예: 줄 또는 정규식)로 시작 하는 모든 프로세스를 찾고 ^[0-9 ]{5}\s\/usr\/공백으로 구분된 한 줄에 해당 pid(또는)를 반환합니다. first 5 chars산출:

255 39207   (no \n's, amount of spacing unimportant).

시도해 보았지만 sed는 이해하기 가장 쉬운 명령은 아닙니다. 어떻게 해야 합니까?

답변1

pid에 대한 모든 숫자를 얻으려면 pgrep다음을 사용하여 이를 수행할 수 있습니다.

pgrep -d " " -f ^/usr

명령으로 시작하는 프로세스의 모든 PID를 포함하는 공백으로 구분된 목록을 인쇄합니다./usr

ps정말로 해당 명령을 사용하고 싶다면 원하는 작업을 수행하는 것보다 awk이것이 더 나은 도구가 될 것입니다 . sedPID의 처음 5자만 사용하여 이 작업을 수행할 수 있습니다. 예를 들면 다음과 같습니다.

ps -ax -o pid,command | awk '$2 ~ /^\/usr/ {printf( "%s ", substr($1,0,5));} END {print ""}'

두 번째 필드가 로 시작하는지 확인합니다 /usr. 그렇다면 첫 번째 필드의 처음 5자를 인쇄하고 그 뒤에 공백을 넣은 다음 좋은 측정을 위해 끝에 개행을 추가하지만 그렇지 않은 경우 제거할 수 있습니다. 마지막에도 줄 바꿈을 원하지 않습니다.

Giles가 지적했듯이 실제로는 PID의 처음 5자만 원하지 않을 수도 있습니다(질문을 잘못 읽었을 수도 있음). 따라서 더 유용한 답변은 다음과 awk같습니다.

ps -ax -o pid,command | awk '$2 ~ /^\/usr/ {printf( "%d ", $1);} END {print ""}'

관련 정보