使用 BASH 和 jq 帮助将 JSON 流解析为 Python

使用 BASH 和 jq 帮助将 JSON 流解析为 Python

我在编写 Python 代码方面表现不错,但 BASH 对我来说相当陌生,我需要一些指导来选择高级方法来实现我的目标,即从实时流式 JSON 文件读取传感器数据并处理数据实时Python。

设置:我有一个运行 Ubuntu 18.04 的系统。该系统连接到一个外围设备,该外围设备读取一些传感器并将读数传输到 JSON 文件。为了开始流,我编写了一个简单的 bash 脚本,它创建一个目录并启动服务。

sudo service my_service stop
if [ -d $LOGDIR ]; then
    echo "All data in ws_log will be erased. Continue? [Y/n]: "
    read ans
    if [ "${ans,,}" = "y" ]; then
        sudo rm -Rf $LOGDIR/*
        echo Directory cleared.
    else
        echo Exiting Script
        exit 1
    fi
else
    mkdir $LOGDIR
    echo $LOGDIR Successfully created!
fi

sudo $SERVDIR/my_service --recording-directory $LOGDIR

一旦服务运行,它就会向终端打印一条消息,告诉用户在完成日志记录后按 Ctrl+c(因此该服务会阻塞终端,直到收到 SIGINT)。

我正在尝试使用 screen 命令在独立的屏幕中运行它,并通过 python 子进程模块将命令传递给它。然而,这看起来很复杂,我不确定 screen 命令是完成这里工作的最佳工具。想法?

下一个问题:JSON 文件中的每个对象都是一个包含 6 个样本和一个时间戳的数据包。流式 JSON 文件每秒附加 20 次。 JSON 文件以“[”开头,然后包含逗号分隔的 JSON 对象。问题是,因为它是流式传输,所以它没有结尾“]”,它以逗号结尾。

到目前为止,我想出了这个命令,它使用 sed 将 JSON 文件中的最后一个逗号替换为“]”,这样杰克能够识别 JSON 对象并将其格式化为每行一个对象。

sed "$ s/,/]/g" log.json | jq -c '.[]' | tail -F >> simpler_log.txt

但是,我希望该行连续运行,直到我的 python 或 bash 脚本告诉它停止。理想情况下,我可以使用 tail -f 的跟踪来防止重复读取同一行。我应该如何解决这个问题?或者我应该以不同的方式做这部分?

最后一个问题:您建议我如何将这些数据推送/拉入我的 python 脚本中?

我想我可以计算已经解析的行数并进行后续读取,如下所示:

pseudo: json.loads(log_file[last_rec_line+1:-1])

但我很乐意听取您关于如何有效地将数据导入 python 的任何建议。

我知道这里有很多东西,我真的很感谢您提供的任何帮助!

编辑:这是 log.json 输入的示例,作为流式传输

[{
    "s_data": {
        "data": [
            [
                8555103,
                8461910,
                16777215,
                0
            ],
            [
                8555205,
                8462544,
                16777215,
                0
            ],
            [
                8555096,
                8461902,
                16777215,
                0
            ],
            [
                8555263,
                8462570,
                16777215,
                0
            ],
            [
                8555098,
                8461900,
                16777215,
                0
            ],
            [
                8555281,
                8462483,
                16777215,
                0
            ]
        ],
        "interval_usec": 8333
    },
    "ts": 1570255057513
},
{
    "s_data": {
        "data": [
            [
                8555122,
                8461908,
                16777215,
                0
            ],
            [
                8555274,
                8462550,
                16777215,
                0
            ],
            [
                8555089,
                8461951,
                16777215,
                0
            ],
            [
                8555255,
                8462559,
                16777215,
                0
            ],
            [
                8555081,
                8461911,
                16777215,
                0
            ],
            [
                8555194,
                8462522,
                16777215,
                0
            ]
        ],
        "interval_usec": 8333
    },
    "ts": 1570255057563
},

这是 simple_log.txt 的输出

{"s_data":{"data":[[8556322,8463977,16777215,0],[8555709,8463977,16777215,0],[8556350,8463989,16777215,0],[8555698,8463993,16777215,0],[8556240,8463965,16777215,0],[8555644,8463958,16777215,0]],"interval_usec":8333},"ts":1570492754634}
{"s_data":{"data":[[8556304,8463955,16777215,0],[8555698,8463973,16777215,0],[8556315,8463965,16777215,0],[8555700,8463962,16777215,0],[8556281,8464029,16777215,0],[8555706,8464020,16777215,0]],"interval_usec":8333},"ts":1570492754684}
{"s_data":{"data":[[8556269,8463948,16777215,0],[8555716,8464027,16777215,0],[8556308,8463958,16777215,0],[8555658,8464075,16777215,0],[8556263,8463945,16777215,0],[8555722,8463991,16777215,0]],"interval_usec":8333},"ts":1570492754734}
{"s_data":{"data":[[8556384,8463866,16777215,0],[8555703,8464072,16777215,0],[8556343,8464003,16777215,0],[8555679,8463964,16777215,0],[8556295,8463911,16777215,0],[8555719,8464070,16777215,0]],"interval_usec":8333},"ts":1570492754784}

相关内容