我有一个日志文件。每当有新日志出现时,我正在做tail -f并执行grep选项。它工作正常,但问题是在map-reduce环境中,查询将分发多个时间。所以如果我运行一个查询它分发到多个节点,我得到多个输出文件。我需要帮助来避免这个问题。这是我的剧本。
EnterpriseID=55302
AuditTypeID=$""
QueryResult=$""
tail -n 0 -F hive-server2.log | \
while read LINE
do
elif [ `echo "$LINE" | grep -c 'select count' ` -gt 0 ]
then
AuditTypeID=22
QueryResult="$(grep -oE 'select count\(.\) from [a-zA-Z][a-zA-Z0-9]*' hive-server2.log | sed -n \$p)"
fi
Additional_Info=$(echo -e "{ \"query\":\"""${QueryResult}""\",\"\"AuditTypeID\":\"""${\"AuditTypeID}""\"}")
echo -e "$Additional_Info" > op.json
current_time=$(date "+%Y.%m.%d-%H.%M.%S")
boto-rsync op.json s3://hive-log/log/script/op.json.$current_time
done
示例输入 - “从表中选择计数(*)” 示例输出 - 仅1个输出文件
当前输出 - 如果我执行1个查询,我将获得12-15个输出文件。因为查询被分发到多个节点。
预期输出 - 如果我执行1个查询(例如:从表中选择count(*))。它应该只创建1个输出文件。任何帮助实现这一逻辑将不胜感激。
答案 0 :(得分:1)
关于:
while read LINE
do
elif [ `echo "$LINE" | grep -c 'select count' ` -gt 0 ]
then
AuditTypeID=22
QueryResult="$(grep -oE 'select count\(.\) from [a-zA-Z][a-zA-Z0-9]*' hive-server2.log | sed -n \$p)"
fi
不是有效语法。您的代码中有一个“裸”elif
,其中一个没有前面的if
。由于elif
是else if
的简写,因此需要前一个if
部分。
如果您只想检查一个条件,那么它应该是if
。