Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用Shell将txt文件转换为“json”对象?_Bash_Shell - Fatal编程技术网

Bash 如何使用Shell将txt文件转换为“json”对象?

Bash 如何使用Shell将txt文件转换为“json”对象?,bash,shell,Bash,Shell,我有一个文本文件,我想将其转换为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_PDQ

我有一个文本文件,我想将其转换为
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
        ]

有人能帮我吗?

要获得简单的翻译,请尝试使用awk;它只读取文件一次:

BEGIN {
  print "{"
}

{
  name=substr($1, 1, length($1)-1)
  value=$2

  print "\t\""name"\":\""value"\","
}

END {
  print "}"
}

这将从字段1中去掉尾随冒号,然后打印由双引号包围的值。它还会自动删除单位(KB),如示例输出所示。

如果
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))
'
希望这有帮助。

或perl:

  • 带模块

  • 没有

    perl -lne '
            @F = split(/:?\s+/);
            push @data, sprintf(q{"%s":"%s"}, map {s/"/""/g; $_} @F[0,1]);
        } END {
            print "[{", join(",", @data), "}]";
    ' file
    

  • 很抱歉,我不知道您的脚本,您能告诉我脚本的工作原理吗?请将代码保存到一个文件中,然后运行
    awk-f thatfilename
    以获得JSON输出[root@host测试]#awk-f 1.shdos2unix来清理它们。
    perl -lne '
            @F = split(/:?\s+/);
            push @data, sprintf(q{"%s":"%s"}, map {s/"/""/g; $_} @F[0,1]);
        } END {
            print "[{", join(",", @data), "}]";
    ' file