bash输出为json格式

时间:2016-03-24 20:34:15

标签: json linux bash

我是Linux和Bash脚本的新手。我试图在Ubuntu Linux中输出几个bash脚本为JSON格式,但是,我似乎无法让它正常工作。

我的目标是得到这个:

date -u +%Y-%m-%d:%H:%M:%S  //date and time

lsb_release -a  //os distro version

ifconfig -a  //ip info

在JSON中使用此格式:

  "datetime":datetime_string,

  "osversion":string,

  "ip_info:  [{"interface":string,"ip_addr":string,"mask":string,"gateway":string},
             {"interface":string,"ip_addr":string,"mask":string,"gateway":string}],

2 个答案:

答案 0 :(得分:0)

使用jo

这样的事情应该很容易
jo datetime=$(date -u +%Y-%m-%d:%H:%M:%S) osversion=$(lsb_release -a) ip_info=$(jo -a $(ip -o addr list))

答案 1 :(得分:0)

Bash本身没有JSON支持。因此,为了保证一致性,您需要使用内置JSON解析和生成支持的外部实用程序。jq是其中之一,下面使用其内置的正则表达式支持:

jq --raw-input \
   --arg date "$(date)" \
   --arg osver "$(lsb_release -a)" \
   '{"date": $date,
     "osver": $osver,
     "ip_info": [inputs |
                 capture("^[0-9]+: (?<ifname>[^[:space:]]+)[[:space:]]+inet (?<addr>[^[:space:]/]+)(/(?<masklen>[[:digit:]]+))?")
                ]
    }' \
   < <(ip -o addr list | grep 'inet ')

在行动on JQPlay中查看此代码。

如果您无法安装未在Linux发行版中内置的工具,请考虑使用Python:

#!/bin/bash
#      ^^^^ - important, not /bin/sh; this uses some bash-only syntax

py_code=$(cat <<'EOF'
import json, re, sys

content={'ip_info': []}
for k, v in [ arg.split('=', 1) for arg in sys.argv[2:] if '=' in arg ]:
  content[k]=v

ip_re = re.compile(r'^[0-9]+:\s+(?P<ifname>\S+)\s+inet (?P<addr>[^/\s]+)(?:/(?P<masklen>\d+))?')
for line in open(sys.argv[1]).readlines():
  m = ip_re.match(line)
  if not m: raise "NOOOO"
  content['ip_info'].append({
    'ifname': m.groups('ifname'),
    'addr': m.groups('addr'),
    'masklen': m.groups('masklen'),
  })

print json.dumps(content)
EOF
)

python -c "$py_code" \
  <(ip -o addr list | grep 'inet ') \
  "date=$(date)" "osver=$(lsb_release -a)"