将输出外壳转换为 JSON

Posted

技术标签:

【中文标题】将输出外壳转换为 JSON【英文标题】:Convert output shell to JSON 【发布时间】:2020-07-06 03:35:58 【问题描述】:

我有 3 个文件负责连接防火墙并让我响应 CPU 使用率,我想将输出 .exp 转换为 JSON,该怎么做?

monitor.exp:

# It has more data above, I posted only the part that matters

expect "#"
send "\ r"

expect "#"
send "show cpu usage \ r"

expect "#"
send "exit \ r"

monitor.conf:

10.0.0.0:10.0.0.1:local-dns:admin@admin#:Brazil

monitor.sh:

for i in `cat /tmp/monitoring/monitor.conf | grep -v ^#`
do
bindip=`echo $i|cut -d: -f1`
endip=`echo $i|cut -d: -f2`
name=`echo $i|cut -d: -f3`
pass=`echo $i|cut -d: -f4`
company=`echo $i|cut -d: -f5`
/usr/bin/expect -f /tmp/monitoring/monitor.exp $bindip $endip $name $pass $company
done

输出显示:

firewall-customer/pri/act#
firewall-custome/pri/act# show cpu usage
CPU utilization for 5 seconds = 90%; 1 minute: 85%; 5 minutes: 80%

期望:

'cpu usage': 'CPU utilization for 5 seconds = 90%; 1 minute: 85%; 5 minutes: 80%'

【问题讨论】:

您需要指定 JSON 输出的外观。它可以像 "CPU utilization for 5 seconds = 90%; 1 minute: 85%; 5 minutes: 80%" 一样简单——这是有效的 JSON。不过,我怀疑您正在寻找比这更复杂的 JSON 结构。 ...就您的问题是“我如何将使用期望检索到的数据编码为 JSON?”,wiki.tcl-lang.org/page/JSON 的所有资源都适用于expect(本身就是 TCL 扩展)。请特别注意其中包含指向jq 的链接,我们有许多现有的问答条目告诉您如何使用。 @LuisHenrique, 'cpu usage': 'CPU utilization for 5 seconds = 90%; 1 minute: 85%; 5 minutes: 80%' 不是有效的 JSON。 JSON 只允许双引号而不是单引号具有语法意义。如果您真正想要的是 Python 数据(确实 允许在该上下文中使用单引号),请考虑使用原生 Python 库 pexpect 而不是基于 TCL 的 @987654334 @. 顺便说一句,请参阅 DontReadLinesWithFor 和 BashFAQ #1。摆脱所有echo | cut 并执行while IFS=: read -r bindip endip name pass company; do [[ $bindip = #* ]] && continue; ...; done </tmp/monitoring/monitor.conf 效率更高 【参考方案1】:

在 bash 中而不是在期望中解决这个问题:

regex=$'CPU utilization for [^\r\n]*'
output=$(/usr/bin/expect -f monitor.exp "$bindip" "$endip" "$name" "$pass" "$company")
if [[ $output =~ $regex ]]; then
  jq -nc --arg cpu_usage "$BASH_REMATCH[0]" '"cpu usage": $cpu_usage'
fi

在 bash 中,[[ $var =~ $regex ]]$var 的内容与$regex 中的正则表达式进行匹配,然后将结果放入一个名为BASH_REMATCH 的数组中。

【讨论】:

以上是关于将输出外壳转换为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

将嵌套的 json 转换为具有特定输出的数据框

将 ctree 输出转换为 JSON 格式(用于 D3 树布局)

使用 Jackson 将 JSON 字符串转换为漂亮的打印 JSON 输出

无法使用 jq 将 JSON 输出转换为 CSV 格式

如何将JSON字符串格式化输出

sh 将stdin转换为其他语言并将其保存为输出路径为.json文件