awk로 컬럼 값 합계 구하기

특정 프로세스의 CPU 및 MEM usage 정보를 취합 출력하는 쉘 스크립트를 작성했는데, 여기에 topawk를 사용했다. 이번에는 특히 awk를 유용하게 사용했다.

다음은 awk에 사용하기 위한 예제로 top 명령의 출력문이다. 물론 리눅스 머신의 모든 프로세스를 보여주기에는 너무 많은 양이므로 (그리고 일부 보안을 위해) 내용을 가공했다. 아래 내용이 top_result라는 파일에 저장되어 있다고 가정한다.

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0   34028   3812   2540 S   0.0  0.1  15:37.54 init
 1722 root      20   0   24872   4912   3224 S   0.0  0.1   0:00.35 bash
19728 root      20   0   24796   6396   3404 S   0.0  0.2   0:00.19 bash
19820 root      20   0   24804   6324   3320 S   0.0  0.2   0:00.37 bash

먼저 init 프로세스의 MEM usage만 찍어보자. COMMAND column의 값이 init인 라인의 %MEM column 값을 찍으면 된다. 각각 $12$10 컬럼이다.

$ awk '$12 == "init" {print $12": "$10}' ./top_result
init: 0.1

다음엔 bash 프로세스의 MEM usage의 합을 구해보자. 위 예제를 사용하면 값이 세개 찍힐 뿐, 그 합을 구할 수 없다.

bash: 0.1
bash: 0.2
bash: 0.2

제대로 된 합을 구하기 위해서는 {…} 액션과 END를 배합해야 한다. 아래와 같이 각 라인에서는 %MEM column의 값을 sum에 더한다. END 다음의 액션에서는 취합이 끝난 결과값을 출력한다.

$ awk '$12 == "bash" {sum += $10} END {print $12": "sum}' ./top_result
bash: 0.5