이 질문은 중복된 것처럼 보일 수 있지만 언뜻 보기에는 그렇습니다.
물론 고정된 양을 추출하는 한 줄의 코드를 작성하는 데 더 이상 도움이 필요하지 않습니다.계속해서데이터 소스의 행(이 예에서는 5개 행). 예 top
:
$ top -b -n1 | awk 'BEGIN {printf "%23s %7s\n","cpu","mem"} NR==8,NR==12 {printf "%-16s %6s%% %6s%%\n",$12,$9,$10}'
이는 시스템에서 가장 CPU 집약적인 프로세스를 표시하고 추가 열에 메모리 사용량을 인쇄하는 매우 편리한 단일 라이너입니다.
지금까지는 너무 좋았는데... 그런데 그렇지가 않네요저것하찮은. 이 목록을 얻으려면 다음을 top
표시하는 것이 필요하며 가능합니다(시스템 로드가 낮을 때).그 자체이 목록의 프로세스로. 통화 중이니까 그런 건 원하지 않아요간격그리고 정기적으로 알을 낳습니다 top
(단기간이라도). 우리 모두 알고 있듯이 우리는8호선(NR==8). 하지만 다른 가상 데스크톱의 두 번째 가상 데스크톱이 top
터미널에 남아 있어 목록도 엉망이 되면 어떻게 될까요? 이 경우 top
두 과정을 모두 생략해야 하므로 마지막으로 처리할 행은 14가 됩니다.
따라서 이 출력을 개선하고 top
그 안의 모든 줄을 필터링하려면 카운터가 필요한 것 같습니다(어쩌면 ? 로 종료 for
하는 루프일 수도 있습니다 break
). 불행하게도 for 루프를 사용한 나의 시도는 i = <number>
지시대로 각 줄을 여러 번 인쇄하기 때문에 지금까지 성과가 없었습니다 i
.
나는 작동하는 다소 해킹된 솔루션을 생각해 냈지만 더 복잡한 경우에는 적합하지 않을 수 있습니다.
top -b -n1 | grep -v ' \btop\b$' | awk 'BEGIN {printf "%23s %7s\n","cpu","mem"} NR==8,NR==12 {printf "%-16s %6s%% %6s%%\n",$12,$9,$10}'
(참고: 두 번째 열의 사용자 이름도 "top"인 경우 원치 않는 결과가 발생할 수 있습니다.)
awk
어쨌든, 이 작업을 수행 하고 제거하는 방법에 대한 단서를 얻을 수 있습니까 grep
?
미리 감사드립니다.
답변1
이는 귀하의 질문에 대한 답변은 아니지만
완전히 다른 방식으로 해결하려는 문제를 해결합니다.
전체 명령은 다음과 같습니다(아래 샘플 출력 참조).
ps -o comm,%cpu,%mem --sort -%cpu -A | head -6
그 부분을 설명하겠습니다.
ps
출력에 대한 더 많은 제어를 위해- 필요한 세 개의 열만 인쇄하세요.
-o comm,%cpu,%mem
ps
데이터가--sort -%cpu
CPU에 의해 내부적으로 역순으로 정렬되도록 합니다 .- 모든 프로세스 나열
-A
- 제목과 결과의 처음 5개 행 표시
| head -6
출력은 첫 번째 명령의 출력과 유사합니다.
$ ps -o comm,%cpu,%mem --sort -%cpu -A | head -6
COMMAND %CPU %MEM
firefox 8.9 15.5
Xorg 1.3 5.6
parcellite 0.3 1.6
compiz 0.2 1.8
konsole 0.1 0.9
프로세스는 ps
전체 목록에 나열됩니다. 상위 PID를 기준으로 프로세스를 제외할 수 있습니다.
다른 곳의 프로세스를 제외하려면 top
명령 이름을 기준으로 수행할 수 있습니다.
모든 프로세스를 선택하면 -A
다음으로 대체됩니다 -N ...
.
ps ... -N --ppid $$ -C top
이제 프로세스를 제외해야 하므로 -N
일치하는 프로세스를 제외한 다른 모든 프로세스를 선택하는 데 사용합니다.
을 제외하려면 ps
이를 사용하여 현재 대화형 셸을 상위 프로세스로 사용하므로 해당 셸의 상위 pid인 PPID를 갖게 됩니다. 현재 쉘의 PID는 입니다 $$
.
따라서 --ppid $$
현재 셸의 모든 하위 프로세스와 일치하면 하나만 있다는 것을 알 수 있습니다 ps
.
top
또한 동일한 컴퓨터의 다른 모니터에서 실행될 수 있는 프로세스를 제외하려고 합니다 . 명령 이름을 와 결합하여 이를 수행합니다 -C top
.
ps
프로세스 자체(및 해당 프로세스만)와 모든 프로세스를 제외한 전체 명령은 top
다음과 같습니다.
ps -o comm,%cpu,%mem --sort -%cpu -N --ppid $$ -C top | head -6
답변2
최고 사령부|아크 '시작'제목 인쇄;개수=5} NR>=8 { if ($0 ~ /당신의맨 위정규식/) 다음; 인쇄필드; if (--count == 0) 종료}'
#8로 시작하는 모든 줄에서 일치하는 경우 top
무시합니다. 그렇지 않으면 원하는 부분을 인쇄하십시오. top
다섯 번째 줄(일치하지 않음)을 인쇄 하고 종료합니다.