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 "}}"
}'