Shell脚本循环多次执行

时间:2018-03-28 10:00:45

标签: bash awk sed grep sh

我有一个日志文件。每当新日志到来时我都会做tail -f和grep选项。我正面临循环问题,它正在执行多次。这是我的剧本,

AuditTypeID=$""
QueryResult=$""
tail -n 0 -F hive-server2.log \
 | while read LINE
 do
   if [ `echo $LINE | grep -c "select *" ` -gt 0 ]
    then
      AuditTypeID=15
      QueryResult=$(
       awk '
          BEGIN{ print "" }
          /Executing command\(queryId/{ sub(/.*queryId=[^[:space:]]+: /,""); q=$0 }
          /s3:\/\//{ print "," q }
          ' OFS=',' hive-server2.log \
       | sed -n \$p
       )
    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

    user=$(
       cat hive-server2.log \
        | grep user \
        | awk -F "[. ]" '{print "," $(NF-1)}' \
        | tr -d ',' \
        | tr -d 'UTC'
       )
     Additional_Info=$(
        echo -e "{\"user\":\"""${user}""\", \"query\":\"""${QueryResult}""\",\"s3Path\":\"""${s3}""\"}"
        )
    echo -e "$Additional_Info" > op.json
    for file in /var/log/hive/op.json
     do
       boto-rsync $file s3://hive-log/log/script/$file.$current_time
     done
 done

它将根据关键字过滤操作。由于某种原因,它正在执行多次。我只需要保存一个实例的输出,并且需要任何帮助来简化逻辑。

1 个答案:

答案 0 :(得分:0)

我在您的脚本中看到的第一件事是,在if语句中的第一个 awk scriptlet中,您似乎正在重新整理hive-server2.log(可能是racy) /糟糕,因为你正在拖尾你的脚本,并且hive-server.log正在增长?)...而这个日志的重新分析似乎是脚本中的一个共同主题 - 我认为这是问题的根本原因

一个简化;)很明显就是删除了elif代码 - 它永远不会运行,因为/select count/将与if语句匹配&# 39; s /select */

为了真正简化这一点,我的策略是在 awk 中重写整个内容。除了 awk 的内置功能之外,您在这里做的一切都没有 - 而 awk 可以像 SH 即可。 awk 实施也可能会快得多。

我开始尝试进行此翻译,但是通过指定hive-server2.log的多次重新分析的方式,我坦率地迷路了。在这里有一点输入和预期输出会有所帮助......请发布hive-server2.log和您预期的输出。