删除一个属性时,请遵循不断增长的JSON文件

时间:2016-02-02 21:08:05

标签: json bash cron filtering

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

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

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

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

1 个答案:

答案 0 :(得分:1)

使用这样的脚本怎么样:

#!/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