我尝试通过标志将其转换为 JSON 格式-J
,但旧lscpu
版本没有此功能。我在这里找到的解决方案对我没有帮助。
我想在这里提出我从另一个社区成员那里得到的解决方案。
答案1
关于解决方案@palmasd1
LANG=C
lscpu |
sed -r 's/$ //g;s/ [ ]+//g' |
awk -F ':' 'BEGIN{printf"{\"cpu\":["}{print x"{\""$1"\":\""$2"\"}";x=","}END{printf"]}"}' |
tr -d '\n'
解释:
LANG=C
:翻译停用lscpu
: 命令awk -F ';' ...
:使用:
字符作为输入字段分隔符
BEGIN {
printf "{\"cpu\":["
}
{
print x "{\""$1"\":\""$2"\"}"
x=","
}
END {
printf "]}"
}
-
BEGIN { ... }
:在所有行处理之前执行{ ... }
:每行处理x
变量用于在除第一行之外的每一行之前添加逗号,其中第一行x
是空的$1
并$2
包含第一个和第二个字段值
END { ... }
:在所有行处理之后执行
tr -d '\n'
:删除所有换行符(*UNIX* 系统下为换行符)
关于此脚本的个人说明:
lscpu -J
它与命令的格式并不完全相同- 输出格式无法防御 JSON 特殊字符(如
/
,"
...)以及包含:
字符的字段值
答案2
LANG=C
lscpu | sed -r 's/$ //g;s/ [ ]+//g' |
awk -F ':' 'BEGIN{printf"{\"cpu\":["}{print x"{\""$1"\":\""$2"\"}";x=","}END{printf"]}"}' |
tr -d '\n'
解释
- 的输出
lscpu
被输入到sed
其中,删除行前面的所有空格,并且所有双空格都被单空格替换。 awk
通过将标签和数据括在双引号中,将每行重新格式化为 JSON。还将每行括在花括号中,并在除第一行之外的每一行前面加上逗号。- 最后,
tr
删除所有新行,只留下一行输出。
可以通过将输出传输到jq