awk: 마지막 줄 번호가 다를 수 있는 고정된 개수의 줄 추출

awk: 마지막 줄 번호가 다를 수 있는 고정된 개수의 줄 추출

이 질문은 중복된 것처럼 보일 수 있지만 언뜻 보기에는 그렇습니다.
물론 고정된 양을 추출하는 한 줄의 코드를 작성하는 데 더 이상 도움이 필요하지 않습니다.계속해서데이터 소스의 행(이 예에서는 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 -%cpuCPU에 의해 내부적으로 역순으로 정렬되도록 합니다 .
  • 모든 프로세스 나열-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다섯 번째 줄(일치하지 않음)을 인쇄 하고 종료합니다.

관련 정보