0

我有一个以下格式的 json 文件,如果 errorCode 为 1,我想编写一个 bash 脚本来对 id 执行操作。

如果 errorCode 为 1,则对 id 执行操作,否则不执行任何操作

[{
    "endTime": null, 
    "errorCode": 1, 
    "id": 219759099, 
}, 

{
    "endTime": null, 
    "errorCode": 0, 
    "id": 219759100, 
}, 

{
   "endTime": null, 
    "errorCode": 0, 
    "id": 219759101, 
}]
4

4 回答 4

1

我会使用带有适当JSON解析器的语言,例如python. 提供一个有效的JSON文件,例如:

[
    {
        "endTime": null,
        "errorCode": 1,
        "id": 219759099
    },
    {
        "endTime": null,
        "errorCode": 0,
        "id": 219759100
    },
    {
        "endTime": null,
        "errorCode": 0,
        "id": 219759101
    }
]

您可以使用以下脚本:

#!/usr/bin/env python
import sys
import json

try:
    json_data=open(sys.argv[1])
except IndexError:
    sys.stderr.write("Please provide a JSON file.\n")
    sys.exit(1)

data = json.load(json_data)

for d in data:
    if d["errorCode"] == 1:
        print d["id"]

将其保存到文件并使其可执行并运行如下:

$ ./get_ids.py file
219759099

您可以将其通过管道传输到您的operation命令中或扩展脚本以执行操作。

于 2013-07-29T11:39:39.657 回答
0

这可以解决问题:

parity=0
for val in $(grep -E "errorCode|id" x.json|grep -Eo [0-9]+)
do
    if [ $parity -eq 0 ]
    then
            if [ $val -eq 1 ]
            then
            parity=1
            fi
    else
            echo "id $val is erroneous"
            parity=0
    fi
done

其中 x.json 是 jason 文件。根据您的要求将包含echo命令的行替换为合适的语句。例如,如果您将 id 附加到错误日志,请尝试:

echo $val >> erroneousIDs.log

注意:我假设字段的顺序总是相同的。

于 2013-07-29T11:24:03.313 回答
0

您可能想看看这个以获得更强大的方法。它使用 sed 和 awk 来解析 JSON。

于 2013-07-29T11:44:08.163 回答
0

使用 awk:

awk -F '[ ":,]+' '$2=="errorCode" && $3==1{err=1} err && $2=="id"{print $3; err=0}' f.json

输出:

219759099

虽然我必须注意,使用 shell 解析 JSON 并不是解析 JSON 的最佳方式,而且如果 JSON 文件的格式发生变化,它也可能容易出错。

于 2013-07-29T11:57:57.210 回答