我有一个文本文件,我想将其转换为json
对象:
MAX_PDQPRIORITY: 80
DS_MAX_QUERIES: 50
DS_MAX_SCANS: 1048576
DS_NONPDQ_QUERY_MEM: 100000 KB
DS_TOTAL_MEMORY: 1000000 KB
我的脚本输出错误,我必须手动将其编辑为json
。
如何使用shell进行更改?
所需的输出:
[
{
"MAX_PDQPRIORITY":"80",
"DS_MAX_QUERIES":"50",
"DS_MAX_SCANS":"1048576",
"DS_NONPDQ_QUERY_MEM":"100000",
"DS_TOTAL_MEMORY":"1000000"
}
]
脚本:
#!/bin/bash
# date:2019-02-02
# informix Show mgmdy .
LANG=EN
pathfile='/home/ampmon/agents/zabbix-agent/script/informix/text'
#expect mgm.#expect |grep -Ev 'Password:|spawn|Invalid' >$pathfile/mgm1.txt
cat $pathfile/mgm1.txt|grep MGM -A 8|grep -Ev 'MGM|-|^$' >$pathfile/mgm.txt
check=`cat $pathfile/mgm.txt|wc -l`
if [ $check -eq 0 ];then
echo "No query results"
exit 1
fi
MAX_PDQPRIORITY=($(cat $pathfile/mgm.txt|grep MAX_PDQPRIORITY |awk -F[:] '{print $2}'|awk '{print $1*1.00}'))
DS_MAX_QUERIES=($(cat $pathfile/mgm.txt|grep DS_MAX_QUERIES |awk -F[:] '{print $2}'|awk '{print $1}'))
DS_MAX_SCANS=($(cat $pathfile/mgm.txt|grep DS_MAX_SCANS |awk -F[:] '{print $2}'|awk '{print $1}'))
DS_NONPDQ_QUERY_MEM=($(cat $pathfile/mgm.txt|grep DS_NONPDQ_QUERY_MEM |awk -F[:] '{print $2}'|awk '{print $1}'))
DS_TOTAL_MEMORY=($(cat $pathfile/mgm.txt|grep DS_TOTAL_MEMORY |awk -F[:] '{print $2}'|awk '{print $1}'))
printf '\t[\n'
printf '\t\t{\n'
printf "\t\t\t \"MAX_PDQPRIORITY\":\"${MAX_PDQPRIORITY}\",\"DS_MAX_QUERIES\":\"${DS_MAX_QUERIES}\",\"DS_MAX_SCANS\":\"${DS_MAX_SCANS}\",\"DS_NONPDQ_QUERY_MEM\":\"${DS_NONPDQ_QUERY_MEM}\",\"DS_TOTAL_MEMORY\":\"${DS_TOTAL_MEMORY}\"}\n"
printf "\t]\n"
我当前的输出:
[
{
","DS_NONPDQ_QUERY_MEM":"100000","DS_TOTAL_MEMORY":"1000000"}ES":"50
]
有人可以帮我吗?
答案 0 :(得分:1)
要进行简单翻译,请尝试使用awk;它只会读取一次文件:
BEGIN {
print "{"
}
{
name=substr($1, 1, length($1)-1)
value=$2
print "\t\""name"\":\""value"\","
}
END {
print "}"
}
这会删除字段1中的尾部冒号,然后打印用双引号引起来的值。如样本输出所示,它还会静默删除单位(KB)。
答案 1 :(得分:1)
如果jq
可用,请尝试:
jq -s -R '[[ split("\n")[] | select(length > 0) | split(": +";"") | {(.[0]): .[1]}] | add]' input.txt
输出:
[
{
"MAX_PDQPRIORITY": "80",
"DS_MAX_QUERIES": "50",
"DS_MAX_SCANS": "1048576",
"DS_NONPDQ_QUERY_MEM": "100000 KB",
"DS_TOTAL_MEMORY": "1000000 KB"
}
]
或者,如果您选择python
,也可以执行以下操作:
#!/bin/bash
python -c '
import re
import json
import collections as cl
list = []
with open("input.txt") as f:
od = cl.OrderedDict()
for line in f:
key, val = re.split(r":\s*", line.rstrip("\r\n"))
od[key] = val
list.append(od)
print (json.dumps(list, indent=4))
'
希望这会有所帮助。
答案 2 :(得分:0)
或perl:
带有JSON模块
perl -MJSON -lne '
@F = split(/:?\s+/);
$data{$F[0]} = $F[1]
} END {
print encode_json [\%data]
' file
无
perl -lne '
@F = split(/:?\s+/);
push @data, sprintf(q{"%s":"%s"}, map {s/"/""/g; $_} @F[0,1]);
} END {
print "[{", join(",", @data), "}]";
' file