Get fancy CLI output

Errors or typos? Topics missing? Hard to read? Let us know!

The MAAS CLI emits JSON data, which while information-rich, can become cumbersome to sift through, especially when dealing with lists of machines. The jq utility emerges as a lifeline, offering robust capabilities for filtering and formatting JSON data directly on the command line.

In this tutorial, we’ll journey through essential jq functionalities—key selection, array manipulation, and interplay with other CLI tools to transform raw MAAS JSON into neat, analysable tabular output.

JSON key fields

Single key selection

To focus on the hostname field for each machine, run the following command:

maas machines read | jq '.[].hostname'

Here, jq navigates through each machine in the array (.[]) and picks the hostname field.

Multiple key selection

To fetch multiple keys, such as hostname and status_name, use:

maas machines read | jq '.[].hostname, .[].status_name'

This will produce output resembling:

[
	"vm-1",
    "Deployed"
]
[
    "vm-2", 
    "Ready"
]

Tabular output

Basic tables

Utilise the @tsv filter to transform JSON arrays into tab-separated values:

maas machines read | jq -r '.[].hostname, .[].status_name | @tsv'

Use -r to output raw text (devoid of quotes).

Aligned columns

For better readability, pipe the output to column -t:

maas machines read | jq -r '.[].hostname, .[].status_name | @tsv' | column -t
vm-1       Deployed
vm-2       Ready

Column headers

Basic headers

Prepend a literal array to jq to introduce column headings:

maas machines read | jq -r '["HOSTNAME", "STATUS"], (.[] | [.hostname, .status_name]) | @tsv' | column -t

Divider rows

Create a separating line between headers and data:

maas machines read | jq -r '["HOSTNAME", "STATUS"] | (.[], map(length*"-")), (.[] | [.hostname, .status_name]) | @tsv' | column -t

Sort and filter

Sorting rows

To sort the output, append sort -k 1 to the pipeline:

... | sort -k 1 

Filtering

To sieve out machines by their status, use select():

... | jq 'select(.status_name == "Ready")'

This opens doors for more complex text processing through chaining CLI tools.

Small + powerful

This tutorial has armed you with practical skills to exploit jq for extracting, shaping, and enhancing the JSON output from the MAAS CLI. By coupling jq with other command-line utilities, you gain a potent toolkit for dissecting and analysing API outputs.

Pro-tip: If you need more jq skills, try working through the jq manual, which is freely available online.

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.