Printing df -h output in json format

Hi All,

i am trying to print the df -h ouput in json format. using below script.

#!/usr/bin/env bash

df -h > /tmp/sdf
nawk '{print " "$1" "$2" "$3" "$4" "$5" "$6" "}' /tmp/sdf > /tmp/sdf1


nawk 'NR==1 {    for (i=1; i<=NF; i++) {        f[$i] = i    }}{ print $(f["file_system"]), $(f["total"]), $(f["used"]), $(f["available"]),  $(f["used_percent"]), $(f["mounted"]) }' /tmp/sdf1 > /tmp/sdf2

nawk '{if(NR>1)print}' /tmp/sdf2 >/tmp/sdf3

nawk ' { printf "\"file_system\":\"" $1  "\",\"total\":\"" $2  "\",\"used\":\"" $3  "\",\"available\":\"" $4  "\",\"used_percent\":\"" $5  "\",\"mounted\":\"" $6  "\" ||"} ' /tmp/sdf3

but i am getting below error while executing the script

ERROR : 



nawk: run time error: not enough arguments passed to printf(""file_system":"udev","total":"16G","used":"12K","available":"16G","used_percent":"1%","mounted":"/dev" ||")
        FILENAME="/tmp/sdf3" FNR=1 NR=1
"file_system":"udev","total":"16G","used":"12K","available":"16G","used_percent":"1root@controller:/var/tmp#

Can someone please let me know what is wrong in the script.

Try print instead of printf. The latter treats the first argument as a format string where % characters are special.

Hello sravani25,

If you were to post the output of your df -h command it could make it possible to let you know even more.
It is OK for learning and quick iteration what you have done with multiple files and multiple invocations of nawk , however, it's quite possilbe to do all the transformation with just one call to awk and one output file.

As explicit as that is, the terser form is more common.

nawk 'NR>1' /tmp/sdf2 > /tmp/sdf3

Here's an example of how I would lean to do what I think you want. You might need to install the command utility jq which is it very handy when dealing with json.
Assuming an output of df -h as:

Filesystem                       Size  Used Avail Use% Mounted on
udev                             983M     0  983M   0% /dev
tmpfs                            200M  5.0M  195M   3% /run
/dev/mapper/debian--10--vg-root   62G  2.0G   57G   4% /
tmpfs                            998M     0  998M   0% /dev/shm
tmpfs                            5.0M     0  5.0M   0% /run/lock
tmpfs                            998M     0  998M   0% /sys/fs/cgroup
mergerfs                          30G  128M   30G   1% /mnt/storage
/dev/sda1                        236M   48M  176M  22% /boot
/dev/sdd1                         10G   43M   10G   1% /mnt/disk2
/dev/sde1                         10G   43M   10G   1% /mnt/disk3
/dev/sdf1                        9.8G   38M  9.3G   1% /mnt/parity1
/dev/sdc1                         10G   43M   10G   1% /mnt/disk1
tmpfs                            200M     0  200M   0% /run/user/1000

Command:

df -h | tr -s ' '   | jq -sR   'split("\n") |
      .[1:-1] |
      map(split(" ")) |
      map({"file_system": .[0],
           "total": .[1],
           "used": .[2],
           "available": .[3],
           "used_percent": .[4],
           "mounted": .[5]})'

Output:

[
  {
    "file_system": "udev",
    "total": "983M",
    "used": "0",
    "available": "983M",
    "used_percent": "0%",
    "mounted": "/dev"
  },
  {
    "file_system": "tmpfs",
    "total": "200M",
    "used": "5.0M",
    "available": "195M",
    "used_percent": "3%",
    "mounted": "/run"
  },
  {
    "file_system": "/dev/mapper/debian--10--vg-root",
    "total": "62G",
    "used": "2.0G",
    "available": "57G",
    "used_percent": "4%",
    "mounted": "/"
  },
  {
    "file_system": "tmpfs",
    "total": "998M",
    "used": "0",
    "available": "998M",
    "used_percent": "0%",
    "mounted": "/dev/shm"
  },
  {
    "file_system": "tmpfs",
    "total": "5.0M",
    "used": "0",
    "available": "5.0M",
    "used_percent": "0%",
    "mounted": "/run/lock"
  },
  {
    "file_system": "tmpfs",
    "total": "998M",
    "used": "0",
    "available": "998M",
    "used_percent": "0%",
    "mounted": "/sys/fs/cgroup"
  },
  {
    "file_system": "mergerfs",
    "total": "30G",
    "used": "128M",
    "available": "30G",
    "used_percent": "1%",
    "mounted": "/mnt/storage"
  },
  {
    "file_system": "/dev/sda1",
    "total": "236M",
    "used": "48M",
    "available": "176M",
    "used_percent": "22%",
    "mounted": "/boot"
  },
  {
    "file_system": "/dev/sdd1",
    "total": "10G",
    "used": "43M",
    "available": "10G",
    "used_percent": "1%",
    "mounted": "/mnt/disk2"
  },
  {
    "file_system": "/dev/sde1",
    "total": "10G",
    "used": "43M",
    "available": "10G",
    "used_percent": "1%",
    "mounted": "/mnt/disk3"
  },
  {
    "file_system": "/dev/sdf1",
    "total": "9.8G",
    "used": "38M",
    "available": "9.3G",
    "used_percent": "1%",
    "mounted": "/mnt/parity1"
  },
  {
    "file_system": "/dev/sdc1",
    "total": "10G",
    "used": "43M",
    "available": "10G",
    "used_percent": "1%",
    "mounted": "/mnt/disk1"
  },
  {
    "file_system": "tmpfs",
    "total": "200M",
    "used": "0",
    "available": "200M",
    "used_percent": "0%",
    "mounted": "/run/user/1000"
  }
]
1 Like