我是 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}],
Bash 本身不支持 JSON。因此,为了保证一致性,您需要使用内置 JSON 解析和生成支持的外部实用程序。jq https://stedolan.github.io/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 ')
查看此代码的实际效果.
如果您无法安装 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)"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)