而尾部grep中的循环逻辑问题

时间:2018-03-29 07:42:20

标签: bash awk sed grep sh

我有一个日志文件。每当有新日志出现时,我正在做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个输出文件。任何帮助实现这一逻辑将不胜感激。

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。由于elifelse if的简写,因此需要前一个if部分。

如果您只想检查一个条件,那么它应该是if