在删除一个属性的同时关注不断增长的 JSON 文件

Follow a growing JSON file while removing one attribute

我想关注 JSON 日志文件 log.json 并删除一个属性。我想将没有此属性的文件转发到日志服务器。我可以每 10 秒删除一次属性,但我需要以某种方式记住位置以仅获取添加的行。

tail -f file.json | jq 'del(.timestamp)' >> filtered_file.json

现在我希望能够恢复这样的过程。有什么简单的方法可以获取自上次检查后添加的 json 条目?

我想告诉 rsyslog 转发 filtered_file.json - 但这只有在不断增长的情况下才有意义。我可以 运行 每 60 秒左右用 cron 过滤一次。

使用这样的脚本怎么样:

#!/bin/bash

INPUT="file.json"
OUTPUT="filtered_file.json"
TEMPO="/tmp/tmpfile.json"
DELAY_SECONDS=60


LAST_MD5=(`md5sum "${INPUT}"`)

while :
do
    # Get filtered input
    cat "${INPUT}" | jq 'del(.timestamp)' > "${TEMPO}"

    # Count different lines between input and output
    DIFF_COUNT=`diff -n "${TEMPO}" "${OUTPUT}" |\
                cut -d" " -f2 | head -n 1`

    # If any change detected: update output file
    if [ "${DIFF_COUNT}" != "" ]
    then
        tail -n "${DIFF_COUNT}" ${TEMPO}
        tail -n "${DIFF_COUNT}" "${TEMPO}" >> "${OUTPUT}"
        LAST_MD5=(`md5sum "${INPUT}"`)
    fi

    # Check if input file has changed
    # it prevents using jq on every iterations
    MD5_INPUT=(`md5sum ${INPUT}`)
    while [ "${LAST_MD5}" = "${MD5_INPUT}" ]
    do
        sleep ${DELAY_SECONDS}
        MD5_INPUT=(`md5sum "${INPUT}"`)
    done
done