출력을 필터링하고 형식을 지정하고 싶지만 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
이것이 더 나은 도구가 될 것입니다 . sed
PID의 처음 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 ""}'