df
does a great job for an overview. But what if I want to set a variable in a shell script to the number of bytes available on a disk?
Example:
$ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda 1111111111 2222222 33333333 10% / tmpfs 44444444 555 66666666 1% /dev/shm
But I just want to return 33333333
(bytes available on /
), not the whole df
output.
Advertisement
Answer
Portably:
df -P /dev/sda1 | awk 'NR==2 {print $4}'
The -P
option ensures that df
will print output in the expected format, and will in particular not break the line after the device name even if it’s long. Passing the device name as an argument to df
removes any danger from parsing, such as getting information for /dev/sda10
when you’re querying /dev/sda1
. df -P
just prints two lines, the header line (which you ignore) and the one data line where you print the desired column.
There is a risk that df
will display a device name containing spaces, for example if the volume is mounted by name and the name contain spaces, or for an NFS volume whose remote mount point contains spaces. In this case, there’s no fully portable way to parse the output of df
. If you’re confident that df
will display the exact device name you pass to it (this isn’t always the case), you can strip it:
df -P -- "$device" | awk -vn=${#device} 'NR==2 {$0 = substr($0, n+1); print $3}'