在删除一个属性的同时关注不断增长的 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
我想关注 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