如何将“ps”和“head”的输出转换为带有键“{#PROCNAME}”的JSON?

如何将“ps”和“head”的输出转换为带有键“{#PROCNAME}”的JSON?

我正在尝试通过内存获取包含前 5 个进程的 JSON 文档。

我想将此 JSON 发送到 Zabbix 并通过内存绘制前 5 个进程。

我通过以下命令获取内存中排名前 5 的进程:

ps axho comm --sort -rss | head -5
node
mongod
kubelet
dockerd
systemd-journal

如何使用key 将ps+的输出转换为 JSON以获得此结构:head{#PROCNAME}

{
  "data": [
    {
      "{#PROCNAME}": "node"
    },
    {
      "{#PROCNAME}": "mongod"
    },
    {
      "{#PROCNAME}": "kubelet"
    },
    {
      "{#PROCNAME}": "dockerd"
    },
    {
      "{#PROCNAME}": "systemd-journal"
    }
  ]
}

https://www.zabbix.com/documentation/current/manual/config/macros/lld_macros

低级发现 (LLD) 功能中使用了一种宏:

{#MACRO} 

答案1

如果您jq有该inputs函数,并且假设{#PROCNAME}只是一个字符串,则可以使用以下内容:

ps axho comm --sort -rss | head -5 | jq -Rn '{data: [inputs|{"#PROCNAME":.}]}'

这些inputs函数可以jq读取所有输入字符串。剩下的就是装饰以获得想要的格式。

该选项-R获取原始字符串作为输入。该选项通过条目-n提供jq输入null。这样inputs可以一次性获取所有字符串。

答案2

实际上,你只需使用标准的 unix cli 就可以实现它:

bash $ echo { \"data\": [  $(ps axho comm --sort -rss | head -5 | xargs -L1 -I% echo { \"{#PROCNAME}\": \"%\" } | paste -s -d, -) ] }
{ "data": [ { "{#PROCNAME}": "node" },{ "{#PROCNAME}": "mongod" },{ "{#PROCNAME}": "kubelet" },{ "{#PROCNAME}": "dockerd" },{ "{#PROCNAME}": "systemd-journal" } ] }
bash $ 
  • 生成的输出是有效的 JSON。

答案3

这类似于奥利夫溶液,但将head操作移至jq

ps axho comm --sort -rss |
jq -Rn '[inputs][:5] | { data: map({ "{#PROCNAME}": . }) }'

第一部分 ,[inputs][:5]从 的输出中提取前五行ps作为数组,第二部分将该数组作为 的值插入data,其中每个元素都转换为带有{#PROCNAME}键的单独对象。

相关内容