Linux命令行table格式的输出转json通用函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46



# 将命令输出转换为JSON格式
command_output_to_json() {
local cmd="$*"
local json

json=$(eval "$cmd" | column -t | awk -F ' +' '
NR==1 {
n=NF
for(i=1;i<=NF;i++) header[i]=$i
next
}
BEGIN { FPAT = "([^ ]+)|(\\([^)]+\\))"; } # 定义字段模式:非空格内容或括号内容
NF>0 {
row="{"
for(i=1;i<=n;i++) {
val=$i
# 1. 先移除首尾空格
gsub(/^[ \t]+|[ \t]+$/, "", val)
# 2. 合并中间多个空格为一个空格
gsub(/[ \t]+/, " ", val)
# 3. 处理特殊字符转义
gsub(/\\/,"\\\\",val)
gsub(/"/,"\\\"",val)
row=row sprintf("\"%s\":\"%s\"", header[i], val) (i<n?",":"")
}
row=row "}"
rows[++rowCount]=row
}
END {
printf "["
for(i=1;i<=rowCount;i++) {
printf "%s", rows[i]
if(i<rowCount) printf ","
}
printf "]"
}
')
echo -n "$json"
}




使用示例

1
command_output_to_json " docker images"