BASH
Extract Data from JSON Files using jq
A bash script demonstrating how to parse and extract specific data from JSON files or API responses using the powerful `jq` command-line JSON processor.
#!/bin/bash
# --- Example JSON Data ---
# For demonstration, we'll create a temporary JSON file.
# In a real scenario, this could be an API response or a config file.
JSON_DATA='{
"name": "My Web App",
"version": "1.2.3",
"status": "active",
"services": [
{"id": "api", "port": 3000, "protocol": "http"},
{"id": "db", "port": 5432, "protocol": "postgres"}
],
"config": {
"env": "production",
"debug": false
}
}'
TEMP_JSON_FILE=$(mktemp /tmp/json_example.XXXXXX.json)
echo "${JSON_DATA}" > "${TEMP_JSON_FILE}"
# --- Using jq to extract data ---
echo "--- Extracting 'name' ---"
jq -r '.name' "${TEMP_JSON_FILE}"
echo "
--- Extracting 'version' and 'status' (comma-separated) ---"
jq -r '"\(.version), \(.status)"' "${TEMP_JSON_FILE}"
echo "
--- Extracting all service IDs ---"
jq -r '.services[].id' "${TEMP_JSON_FILE}"
echo "
--- Extracting 'port' of the service with id 'api' ---"
jq -r '.services[] | select(.id == "api") .port' "${TEMP_JSON_FILE}"
echo "
--- Extracting all keys from 'config' ---"
jq -r '.config | keys[]' "${TEMP_JSON_FILE}"
echo "
--- Filtering JSON based on condition (services with port > 3000) ---"
jq '.services[] | select(.port > 3000)' "${TEMP_JSON_FILE}"
# Clean up temporary file
rm "${TEMP_JSON_FILE}"
How it works: This script demonstrates how to effectively parse and extract specific pieces of information from JSON data using `jq`, a powerful command-line JSON processor. It covers selecting individual fields, array elements, filtering arrays based on conditions, and extracting nested values, which is highly useful for processing API responses or configuration files.