Printing df -h output in json format


 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers Printing df -h output in json format
# 1  
Old 01-03-2020
Printing df -h output in json format

Hi All,


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


Code:
#!/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



Code:
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.
Moderator's Comments:
Mod Comment
Please use code tags when posting data and code samples!

Last edited by vgersh99; 01-03-2020 at 11:41 AM.. Reason: code tags, please!
# 2  
Old 01-03-2020
Try print instead of printf. The latter treats the first argument as a format string where % characters are special.
# 3  
Old 01-03-2020
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.
Quote:
nawk '{if(NR>1)print}' /tmp/sdf2 >/tmp/sdf3
As explicit as that is, the terser form is more common.
Code:
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:
Code:
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:
Code:
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:
Code:
[
  {
    "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"
  }
]

This User Gave Thanks to Aia For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

How to convert any shell command output to JSON format?

Hi All, I am new to shell scripting, Need your help in creating a shell script which converts any unix command output to JSON format output. example: sample df -h command ouput : Filesystem size used avail capacity Mounted /dev/dsk/c1t0d0s0 8.1G 4.0G 4.0G 50% /... (13 Replies)
Discussion started by: balu1234
13 Replies

2. Shell Programming and Scripting

JSON Output format

Dear friends, I'm getting below API result and i would like to format them with Shell scripting. Input "id": 9, "description": "short desc", "name": "test", "name_with_namespace": "ABCD-PDFF-PLATFORM-TEST-V1 / test", "path": "test", "path_with_namespace":... (7 Replies)
Discussion started by: baluchen
7 Replies

3. Shell Programming and Scripting

Help required in printing in specific format

Hi All, I 'm matching two files based on the first 2 columns and then populate other fields along with subtraction of few fields. I have managed to get the output. However, is there a easier way in formatting the output as shown below instead of using additional printf for getting fixed width... (4 Replies)
Discussion started by: shash
4 Replies

4. UNIX for Dummies Questions & Answers

Printing files in a specific format

Hi, I have following files in a directory with '.meta' extension, which have data in follwoing patterns. i need to print data from these files in below metioned format. please provide a script for this solution. file names: TEST_HISTORY_MTH.meta AB_TEST_1.meta cat... (2 Replies)
Discussion started by: AAHinka
2 Replies

5. UNIX for Dummies Questions & Answers

Help with printing advance output format from a file

Hi, below 'awk' code was given for my thread 'Help with printing output format from a file ' earlier, however script is not resulting expected output with below file content. cat test_tes123.dml record string("\001") emp_num; /* CHAR(11) NOT NULL*/ date("YYYYMMDD")... (1 Reply)
Discussion started by: AAHinka
1 Replies

6. UNIX for Dummies Questions & Answers

Help with printing output format from a file

Hi, I need help in printing data in below format from file extensions with .dml, i have listed details below file name is test_temp.dml, location in /home/users/test01/test_temp.dml file content: sample_type= record decimal(",") test_type; date("DD-MM-YYYY")(",") test_date... (2 Replies)
Discussion started by: AAHinka
2 Replies

7. UNIX for Dummies Questions & Answers

Printing records in different format

Hi all, I have a input file say record.txt hostname IP_address Port_No Version A 10.10.10.1 80 6.02 B 10.10.10.2 81 6.03 C 10.10.10.3 82 6.04 row 1 has 4 field headings : hostname, IP_address, Port_No and Version. and from 2nd row onwards the actual records start. now i need to... (2 Replies)
Discussion started by: PranavEcstasy
2 Replies

8. Shell Programming and Scripting

perl code-sequence of json format

Hi All , Below is the perl code. from below code want to confirm one thing that wahtever the sequence of data we are passing through json format which contains 3 tuples of different sequences Eg: ParentID,SystemID,SendingTime,Time,ClientLocation,ClientID, ... (1 Reply)
Discussion started by: aish11
1 Replies

9. Shell Programming and Scripting

printing format for hexadecimal signed number

Hello Experts,, I m facing a problem as follows.. need help.. When I am giving the below command it gives me three digit hexadecimal number , for ex :- printf("%0.3x", 10); Output: 00a But I want the same for signed number also. Now when I am specifiying the... (10 Replies)
Discussion started by: user_prady
10 Replies

10. UNIX for Dummies Questions & Answers

printing out procedures in unknown format

Does Anybody know how to print procedures written in this format? .. .nr PS 11 .nr VS 14 .nr LL 6.5i .ad l .DA 1/9/91 .in 4.0i .DS Shepard D. Johnson .DE .in 0i .sp .sp .sp .LG .ce .B Pressure Sensors (P/N 16-0018-0 & 16-0018-1) Test Procedure (1 Reply)
Discussion started by: rjtrjt
1 Replies
Login or Register to Ask a Question