繁体   English   中英

Shell脚本循环执行多次

[英]Shell Script loop is executing multiple times

我有一个日志文件。 每当有新日志出现时,我都会执行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

它将根据关键字过滤操作。 由于某种原因,它执行了多次。 我只需要保存一个实例的输出,就可以帮助您简化逻辑。

我在脚本中看到的第一件事是,在if语句内的第一个awk脚本中,您似乎正在重新解析整个hive-server2.log (这可能很不好/很坏,因为您要跟踪脚本和hive-server.log正在增长?)...,日志的重新解析似乎是脚本中的常见主题-我认为这是问题的根本原因。

一个简单的简化;)显而易见的是删除了elif代码-它永远不会运行,因为/select count/将与if语句的/select */匹配。

为了真正简化这个过程,我的策略是用awk重写整个过程。 您在这里所做的任何事情都无法超越awk的内置功能-而且awk可以像sh一样轻松地触发外部shell命令。 awk的实现也可能会快得多。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM