인쇄된 메모리 사용량을 점에서 쉼표로 변경하고 메모리 사용량을 %로 계산합니다.

인쇄된 메모리 사용량을 점에서 쉼표로 변경하고 메모리 사용량을 %로 계산합니다.

지금까지 이전에 받은 질문 중:실제 메모리 사용량을 계산하려면 /proc/meminfo 한 줄을 사용하십시오(memtotal - memfree - 캐시됨 - 버퍼링됨).

@Philippos에게 감사드립니다. 이 명령은 올바른 메모리 사용량을 인쇄합니다.

echo $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s__/1024-_g;s_$_/1024_' /proc/meminfo))) > test && awk -v CONVFMT='%.2f' '{print $1/1024""}' test && rm test

이것은 다음을 인쇄합니다:

1.32

이는 bash의 한 줄에서 계산한 최종 값과 매우 가깝습니다. 그러나 더 많은 단계를 추가하고(예: 당황스럽게 파일 생성 및 여러 개의 동일한 명령) 모든 점을 쉼표로 변환해 보십시오. 값을 다음과 같이 인쇄할 수 없습니다.

1,32

이 명령/솔루션은 Python의 OLED 화면에 표시할 수 있도록 친구에게 무언가를 전달하는 데 효과적입니다.

그러나 다음이자 마지막 단계는 전체 시스템 메모리와 비교하여 사용량(%)을 계산하는 것입니다. 그래서 이렇게 :

43%

그런 다음 주어진 문장에서 나와야 합니다.

시간을 내어 읽고 도움을 주신 모든 분들께 감사드립니다. 정말 감사합니다!

답변1

출력을 위해 printf(1) 유틸리티를 사용할 수 있습니다. man 3 printf참고자료의 형식 지정자에 대한 설명을 참조하세요 . 특히,

일부 숫자 변환의 경우 기수 문자("소수점") 또는 천단위 그룹화 문자가 사용됩니다. 사용되는 실제 문자는 로케일의 LC_NUMERIC 부분에 따라 다릅니다. (setlocale(3)을 참조하십시오.) POSIX 로케일은 기수 문자로 "."을 사용하며 그룹화 문자가 없습니다. 따라서 printf("%'.2f", 1234567.89); 결과는 POSIX 로케일에서 "1234567.89", nl_NL 로케일에서 "1234567,89", da_DK 로케일에서 "1.234.567,89"입니다.

printf "%0.2f MB\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s__/1024-_g;s_$_/1024_' /proc/meminfo) ))

백분율 출력의 경우 1024로 나누면 정밀도가 손실되므로 바람직하지 않을 수 있습니다. 그러므로:

printf "%d%%\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s_([^\n]+)\n_@\1@100*(\1-(_;s_\n_+_g;'\
's_@([^@]+)@(.*)$_\2))/\1_' /proc/meminfo) ))

위 명령의 정규식은 아마도 더 우아하고 컴팩트하게 만들어질 수 있습니다.

두 명령을 하나로 결합합니다.

printf "%0.2f MB %d%%\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s__/1024-_g;s_$_/1024_' /proc/meminfo) )) \
$(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s_([^\n]+)\n_@\1@100*(\1-(_;s_\n_+_g;'\
's_@([^@]+)@(.*)$_\2))/\1_' /proc/meminfo) ))

고쳐 쓰다:사용된 메모리 비율을 MB 단위로 계산하려면정확성이 떨어졌음에도 불구하고,대신 다음을 실행할 수 있습니다.

printf "%d%%\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s_([^\n]+)\n_@\1@100*(\1/1024-(_;s_\n_/1024+_g;'\
's_@([^@]+)@(.*)$_\2/1024))/(\1/1024)_' /proc/meminfo) ))

필요한 경우 추가하십시오 /1024. 이 경우 두 계산이 모두 포함된 단일 명령은 다음과 같습니다.

printf "%0.2f MB %d%%\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s__/1024-_g;s_$_/1024_' /proc/meminfo) )) \
$(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/'\
'{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s_([^\n]+)\n_@\1@100*(\1/1024-(_;s_\n_/1024+_g;'\
's_@([^@]+)@(.*)$_\2/1024))/(\1/1024)_' /proc/meminfo) ))

업데이트 2:Bash에서 위 명령을 대화형으로 입력하면 대화형 모드 및 스크립트 처리 시( \<newline>내부 조합과 관련하여) Bash의 동작이 다르기 때문에 $()작동하지 않을 수 있습니다 $(()). mksh(내가 사용하고 있는)와 같은 다른 쉘은 이와 관련하여 대화식으로 입력된 명령을 다르게 처리하지 않습니다.

매우 긴 줄처럼 읽기 어려운 명령은 다음과 같습니다.

백분율:

printf "%d%%\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s_([^\n]+)\n_@\1@100*(\1/1024-(_;s_\n_/1024+_g;s_@([^@]+)@(.*)$_\2/1024))/(\1/1024)_' /proc/meminfo) ))

두 출력 모두 하나의 명령에 있습니다.

printf "%0.2f MB %d%%\n" $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s__/1024-_g;s_$_/1024_' /proc/meminfo) )) $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s_([^\n]+)\n_@\1@100*(\1/1024-(_;s_\n_/1024+_g;s_@([^@]+)@(.*)$_\2/1024))/(\1/1024)_' /proc/meminfo) ))

관련 정보