使用Linux服务器获取键值对

时间:2019-06-29 05:24:46

标签: json regex linux awk grep

我正在寻找从格式不正确的json获得的密钥对,因此我无法使用jq或其他方法来获取JSON密钥值对。另外,数据不会按特定顺序打印,因此我无法通过特定的列或字段号来获取数据。

做到这一点的最佳方法是什么?我在构建正则表达式或使用cut使其正常工作时遇到问题。

 root# python3 getprice.py 
{'bid': '11546.94', 'ask': '11551.96', 'volume': {'USD': '51726566.064352112368', 'TLC': '4388.676466043', 'timestamp': 1561785300000}, 'last': '11551.96'}
root# python3 getprice.py
{'last': '11551.96', 'bid': '11546.94', 'ask': '11551.96', 'volume': {'timestamp': 1561785300000, 'USD': '51726566.064352112368', 'TLC': '4388.676466043'}}
root# python3 getprice.py
{'bid': '11547.44', 'ask': '11551.96', 'volume': {'TLC': '4388.676466043', 'timestamp': 1561785300000, 'USD': '51726566.064352112368'}, 'last': '11551.96'}

2 个答案:

答案 0 :(得分:2)

它看起来像JSON,但带有引号。如果您的文件是这样的:

$ cat file.txt
{'bid': '11546.94', 'ask': '11551.96', 'volume': {'USD': '51726566.064352112368', 'TLC': '4388.676466043', 'timestamp': 1561785300000}, 'last': '11551.96'}

然后您可以:

$ cat file.txt | tr "'" '"' | jq '.'
{
  "bid": "11546.94",
  "ask": "11551.96",
  "volume": {
    "USD": "51726566.064352112368",
    "TLC": "4388.676466043",
    "timestamp": 1561785300000
  },
  "last": "11551.96"
}

或者只是为了获得一个ask值:

$ cat file.txt | tr "'" '"' | jq '.ask'
"11551.96"

答案 1 :(得分:0)

除了编写自己的自定义解析器之外,解析数据的最简单方法可能是在node.js中eval(一种在JSON.parse()之前解析JSON的旧技术):

#! /usr/bin/env node
// A simple script to parse javascript objects from stdin (not just JSON)

// Pass the key you want to extract as argument:
let key = process.argv[2];

let rawData = '';

process.stdin.on('data', x => rawData += x.toString());
process.stdin.on('end',() => {
    eval('var obj = ' + rawData);   // CAREFUL - EVAL IS EVIL!!!
    console.log(eval 'obj.' + key); // ALSO EVIL!
});

将以上脚本另存为'jsonparse'并使其可执行。然后,您可以像这样使用它:

python3 getprice.py | jsonparse bid
python3 getprice.py | jsonparse volume.USD