How can I find out the total physical memory (RAM) of my linux box suitable to be parsed by a she...
Categories:
Accurately Determine Linux RAM for Scripting

Learn how to reliably extract total physical memory (RAM) on a Linux system using various command-line tools, suitable for parsing in shell scripts.
When automating tasks on Linux systems, shell scripts often need to query system hardware specifications, such as the total amount of physical memory (RAM). However, different tools provide output in varying formats, making it crucial to select a method that is both accurate and easily parsable. This article explores several robust commands and techniques to retrieve RAM information, focusing on their suitability for scripting.
Understanding Memory Reporting in Linux
Linux systems provide several ways to report memory usage, primarily through the /proc
filesystem and utilities that parse its contents. The /proc/meminfo
file is the authoritative source for memory statistics, offering detailed information. Other commands like free
, dmidecode
, and lshw
provide more human-readable or hardware-specific outputs. For scripting, the key is to extract only the total physical memory in a consistent unit (e.g., KB, MB, GB) without extraneous text.
flowchart TD A[Start: Script Needs RAM] --> B{Choose Method} B -- "/proc/meminfo" --> C[Read MemTotal] B -- "free -b" --> D[Read total from 'Mem' line] B -- "dmidecode" --> E[Parse 'Size' from 'Memory Device'] C --> F{Extract Numeric Value} D --> F E --> F F --> G[Convert to Desired Unit (e.g., MB)] G --> H[Output for Script] H --> I[End]
Flowchart for extracting total RAM on Linux for scripting.
Method 1: Using /proc/meminfo
(Recommended for Scripting)
The /proc/meminfo
file is a pseudo-filesystem entry that provides real-time information about the system's memory. It's highly reliable and consistent across different Linux distributions. The MemTotal
entry specifically indicates the total usable RAM. We can use grep
and awk
to extract this value.
#!/bin/bash
# Get total RAM in KB
TOTAL_RAM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
# Convert to MB (integer division)
TOTAL_RAM_MB=$((TOTAL_RAM_KB / 1024))
# Convert to GB (integer division)
TOTAL_RAM_GB=$((TOTAL_RAM_KB / 1024 / 1024))
echo "Total RAM (KB): ${TOTAL_RAM_KB}"
echo "Total RAM (MB): ${TOTAL_RAM_MB}"
echo "Total RAM (GB): ${TOTAL_RAM_GB}"
# For precise MB/GB with floating point (requires bc)
# TOTAL_RAM_MB_FLOAT=$(echo "scale=2; ${TOTAL_RAM_KB} / 1024" | bc)
# TOTAL_RAM_GB_FLOAT=$(echo "scale=2; ${TOTAL_RAM_KB} / 1024 / 1024" | bc)
# echo "Total RAM (MB, precise): ${TOTAL_RAM_MB_FLOAT}"
# echo "Total RAM (GB, precise): ${TOTAL_RAM_GB_FLOAT}"
Extracting and converting total RAM from /proc/meminfo
.
MemTotal
value from /proc/meminfo
is always reported in kilobytes (KB). Always account for this unit when performing conversions to MB or GB in your scripts.Method 2: Using the free
Command
The free
command provides a summary of memory and swap usage. While it's often used interactively, its output can also be parsed. Using the -b
option ensures byte-level output, which simplifies parsing compared to human-readable formats (e.g., free -h
).
#!/bin/bash
# Get total RAM in bytes using free -b
# The 'Mem:' line's second column is total physical memory
TOTAL_RAM_BYTES=$(free -b | grep Mem: | awk '{print $2}')
# Convert to MB
TOTAL_RAM_MB=$((TOTAL_RAM_BYTES / 1024 / 1024))
# Convert to GB
TOTAL_RAM_GB=$((TOTAL_RAM_BYTES / 1024 / 1024 / 1024))
echo "Total RAM (Bytes): ${TOTAL_RAM_BYTES}"
echo "Total RAM (MB): ${TOTAL_RAM_MB}"
echo "Total RAM (GB): ${TOTAL_RAM_GB}"
Extracting total RAM using free -b
.
free
output without the -b
option, as the units (K, M, G) can vary, making reliable parsing difficult for scripts. Always use -b
for consistent byte output.Method 3: Using dmidecode
(Hardware-Specific)
dmidecode
extracts information from the system's DMI (Desktop Management Interface) table, which contains hardware details. This method is useful for getting the physical capacity of installed RAM modules, rather than just what the kernel reports as usable. It requires root privileges.
#!/bin/bash
# Check for root privileges
if [[ $EUID -ne 0 ]]; then
echo "This script requires root privileges to run dmidecode." >&2
exit 1
fi
# Get total RAM by summing up individual memory device sizes
TOTAL_RAM_MB=0
while IFS= read -r line; do
if [[ $line =~ Size:([[:space:]]+)([0-9]+)([[:space:]]+)(MB|GB) ]]; then
SIZE=${BASH_REMATCH[2]}
UNIT=${BASH_REMATCH[4]}
if [[ "$UNIT" == "GB" ]]; then
SIZE=$((SIZE * 1024))
fi
TOTAL_RAM_MB=$((TOTAL_RAM_MB + SIZE))
fi
done < <(dmidecode --type memory | grep -E 'Size:.*(MB|GB)')
TOTAL_RAM_GB=$((TOTAL_RAM_MB / 1024))
echo "Total Physical RAM (MB): ${TOTAL_RAM_MB}"
echo "Total Physical RAM (GB): ${TOTAL_RAM_GB}"
Extracting total physical RAM using dmidecode
.
dmidecode
provides details about installed memory modules. The sum of these module sizes should match the total physical RAM. This can sometimes differ slightly from MemTotal
if a small portion of RAM is reserved by hardware.