我是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}],
答案 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)"