bash에서 내 MOTD와 전면 OLED 디스플레이의 실제 메모리 사용량을 계산하려고 합니다.
안타깝게도 숫자를 kB에서 MB로 올바르게 변환하지 않았습니다. 하지만 공식은 다음과 같습니다 /proc/meminfo
.
MemTotal - MemFree - 캐시 - 버퍼
를 사용하여 추출할 수 있습니다 grep -e
. 그러나 나는 다음과 같은 점을 주장합니다.
- 어떻게 값만 grep할 수 있나요
/proc/meminfo
? - 이 숫자를 kB에서 MB(/1024)로 어떻게 변환합니까?
그래서 내 임무는 위에서 언급한 값을 빼고 그 값을 단일 값으로 인쇄하는 것입니다(덧셈 MB
은 보너스입니다).
답변1
GNU를 사용하면 sed
다음과 같은 일을 할 수 있습니다.
sed -zE 's_.*MemTotal: *([0-9]*).*\nMemFree: *([0-9]*).*\nBuffers: *([0-9]*).*\nCached: *([0-9]*).*_echo $(((\1-\2-\3-\4)/1024)) MB_e' /proc/meminfo
이 -z
옵션은 단일 버퍼의 전체 파일을 읽어 proc/meminfo
단일 정규식에서 4개의 값을 모두 추출하고 그로부터 명령 e
의 위험 플래그를 사용하여 명령을 실행하는 계산을 구성합니다 s
.
플래그가 있거나 없는 POSIX 버전의 경우 sed
명령 대체를 통해 계산에서 추출을 채울 수 있습니다(동일하게 위험함).-z
e
sed
echo $(( ($(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s//-/g' /proc/meminfo)) / 1024)) MB
줄이 길다는 건 알지만 둘 다 한 줄인 것 같아요.
고쳐 쓰다:다른 반올림
설명에서는 빼기 전에 각 값을 MB로 변환하도록 요청합니다. 수정된 스크립트는 다음과 같습니다.
echo $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s__/1024-_g;s_$_/1024_' /proc/meminfo))) MB
이로 인해 추가 반올림 오류가 발생합니다. 예를 들어
MemTotal: 16359572 kB
MemFree: 6614000 kB
Buffers: 602108 kB
Cached: 3685372 kB
5330MB 대신 5333MB를 출력합니다(실제 값: 5330.16MB).