dmidecode | awk ' BEGIN { printf "{" first_entry = 0 is_array = 0 array_first_entry = 0 } { if ($0 ~ /^Handle/) { if (is_array) { printf "]" is_array = 0 } if (first_entry) { printf "}," } first_entry = 1 gsub(/,$/, "", $2); printf "\"%s\": {", $2 getline line printf "\"_description\": \"%s\"", line gsub(/,$/, "", $5); printf ",\"_type\": \"%s\"", $5 gsub(/,$/, "", $6); printf ",\"_bytes\": \"%s\"", $6 } else if ($0 ~ /:/) { if (is_array) { printf "]" is_array = 0 } gsub(/^[[:space:]]+/, "", $0) split($0, a, ": "); if (length(a) > 1) { gsub(/"/, "\\\"", a[2]) gsub(/[[:space:]]+$/, "", a[2]) printf ",\"%s\": \"%s\"", a[1], a[2] } else if (length(a) == 1) { gsub(/:$/, "", a[1]) printf ",\"%s\": [", a[1] is_array = 1 array_first_entry = 0 } } else if (is_array && NF > 0) { if (array_first_entry) { printf "," } array_first_entry = 1 gsub(/^[[:space:]]+/, "", $0) gsub(/"/, "\\\"", $0) printf "\"%s\"", $0 } } END { if (is_array) { printf "]" } print "}}" }'