Bash

如何使用鍵 {#PROCNAME} 將 bash 輸出轉換為 JSON?

  • February 27, 2019

我嘗試通過記憶體獲取前 5 個程序的 JSON。

我想將此 JSON 發送到 Zabbix 並通過記憶體繪製前 5 個程序。

我通過命令通過記憶體獲得前 5 個程序:

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

如何使用鍵 {#PROCNAME} 將 bash 輸出轉換為 JSON 以獲得此結構:

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

如果您jq具有該inputs功能,並且假設{#PROCNAME}只是一個字元串,則可以使用以下內容:

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

這些inputs函式可以jq讀取所有輸入字元串。剩下的就是裝飾以獲得想要的格式。

該選項-R將原始字元串作為輸入。該選項-njq輸入與null條目一起提供。這樣inputs可以一次獲得所有字元串。

實際上,您可以使用標準的 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。

引用自:https://unix.stackexchange.com/questions/503127