SelfTaught
SelfTaught

Reputation: 499

Perl - get free disk space usage on linux

I'm wondering how I can get the value of the second row, 4th column from df ("/"). Here's the output from df:

Filesystem      Size  Used Avail Use% Mounted on
rootfs          208G  120G   78G  61% /
fakefs          208G  120G   78G  61% /root
fakefs          1.8T  1.3T  552G  70% /home4/user
fakefs          4.0G  1.3G  2.8G  31% /ramdisk/bin
fakefs          4.0G  1.3G  2.8G  31% /ramdisk/etc
fakefs          4.0G  1.3G  2.8G  31% /ramdisk/php
fakefs          208G  120G   78G  61% /var/lib
fakefs          208G  120G   78G  61% /var/lib/mysql
fakefs          208G  120G   78G  61% /var/log
fakefs          208G  120G   78G  61% /var/spool
fakefs          208G  120G   78G  61% /var/run
fakefs          4.0G  361M  3.7G   9% /var/tmp
fakefs          208G  120G   78G  61% /var/cache/man

I'm trying to get the available free space (78GB) using perl which I'm fairly new to. I'm able to get the value using the following linux command but I've heard it's not necessary to use awk in perl at all because perl can do what awk can natively.

df -h | tail -n +2 | sed -n '2p' | awk '{ print $4 }'

I'm stumped. I tried using the Filesys::df module but when I'd print out the available usage percent, it'd give me a different value than what running df from command line does. Help is appreciated.

Upvotes: 1

Views: 2986

Answers (3)

7stud
7stud

Reputation: 48649

A little more succinctly:

df -h | perl -wlane 'print $F[3] if $. == 2;'


-w   enable warnings
-l   add newline to output(and chomps newline from input line)
-a   splits the fields on whitespace into the @F array, which you access using the syntax $F[n] (first column is at index position 0)
-n   puts the code inside the following loop:

    LINE:
        while (<>) { 
            ...     # code goes here
        }
     # <> reads lines from STDIN if no filenames are given on the command line

-e   execute the string
$.   current line number in the file (For the first line, $. is 1) 

Upvotes: 6

Jotne
Jotne

Reputation: 41460

This seems to work ok too:

df -h | awk 'NR==2 {print $4}'

Get the second line and pint fourth field.

Upvotes: 0

Simon
Simon

Reputation: 10841

If you wish to do this all in perl, then:

df -h | perl -e 'while (<stdin>) { if ($. == 2) { @x = split; print $x[3] }}'

This uses perl alone to read the output of df -h and, for the second record ($. == 2) splits the record into fields, based on whitespace, and outputs field 3 (counting from 0).

Upvotes: 1

Related Questions