awk가 같은 줄에 3개 항목을 인쇄한 다음 새 줄로 전환하는 방법

awk가 같은 줄에 3개 항목을 인쇄한 다음 새 줄로 전환하는 방법

타임스탬프, Mem 사용 및 Swap 사용을 선택하기 위해 최상위 결과의 출력을 구문 분석하려고 합니다.

top - 12:06:52 up  3:36, 37 users,  load average: 0.00, 0.02, 0.00
Tasks: 563 total,   1 running, 562 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.1%sy,  0.0%ni, 99.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  65968400k total,  9594508k used, 56373892k free,   199136k buffers
Swap: 68026360k total,        0k used, 68026360k free,  5864056k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                    
11527 root      15   0 26464 1728 1056 R  1.9  0.0   0:00.01 top                                                        

이것은 하나의 샘플입니다. 이제 다음 awk cmd를 얻습니다.

awk '$1 ~/top/ {print $5;} $1 ~/Mem/ {print $4;} $1 ~/Swap/  {print $4;}' top-output

하지만 새로운 줄에 모든 것을 출력하기 때문에 완벽하지는 않습니다. 이와 같이:

7:40,
12644016k
0k
7:50,
12411248k
0k 
8:04,
12795392k
0k

다음과 같이 출력하고 싶습니다.

7:40, 12644016k, 0k
7:50, 12411248k, 0k

어떻게 해야 하나요? 감사해요

답변1

한 가지 방법은 다음을 사용하는 것입니다 printf.

$ awk '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%s ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36, 9594508k 0k

printf유연한 형식을 제공하며 명시적으로 지시하지 않는 한 개행 문자를 인쇄하지 않습니다. 첫 번째 매개변수 printf는 형식 문자열입니다 printf. 형식 문자열은 에 설명되어 있습니다 man awk.

print값을 저장하고 한 번만 사용하는 또 다른 방법은 다음과 같습니다.

$ awk '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4;} $1 ~/Swap/  {print up,used,$4;}' top-output
3:36, 9594508k 0k

추가 쉼표를 추가하세요

$ awk '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%s, ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36, 9594508k, 0k

$ awk '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4;} $1 ~/Swap/  {print up,used",",$4;}' top-output
3:36, 9594508k, 0k

벗겨지다k

printf를 사용하면 정수 형식을 지정하고 숫자로 변환하여 다음을 제거할 수 있습니다 k.

$ awk '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%i, ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36, 9594508, 0k

숫자로 변환하는 또 다른 방법은 숫자에 0을 추가하는 것입니다. 따라서 다음을 used=$4+0대신 사용할 수 있습니다 used=$4.

$ awk '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4+0;} $1 ~/Swap/  {print up,used",",$4;}' top-output
3:36, 9594508, 0k

가동 시간에서 쉼표 제거

가동 시간에는 두 숫자 사이에 콜론이 있으며 awk는 이를 숫자로 변환할 수 없습니다. 이는 다른 방법이 필요하다는 것을 의미합니다. 출력에서 쉼표를 사라지게 하는 한 가지 방법은 필드 구분 기호에 쉼표를 추가하는 것입니다.

$ awk -F'[,[:space:]]+' '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%s ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36 9594508k 0k

$ awk -F'[,[:space:]]+' '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4+0;} $1 ~/Swap/  {print up,used,$4;}' top-output
3:36 9594508 0k

관련 정보