【问题标题】:Shell Script loop is executing multiple timesShell 脚本循环多次执行
【发布时间】:2018-09-06 23:09:34
【问题描述】:

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

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

【问题讨论】:

  • 使用 4 个空格或制表符修复代码格式以使其可读
  • 一团糟,祝你好运
  • 你有两个循环,一个在另一个里面。 (while 循环内的 for 循环)。你在哪里看到问题? (说“执行多次”循环是个问题似乎很奇怪——这不是循环的用途吗?)
  • @Jeyamahesan,您可以发布示例输入和示例输出,以便我们也可以在这里提供更好的解决方案。
  • 从这个开始:shellcheck.net

标签: bash awk sed grep sh


【解决方案1】:

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

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

要真正尝试简化这一点,我的策略是在 awk 中重写整个过程。您在这里所做的一切都超出了 awk 的内置功能——并且 awk 可以像 sh。 awk 实现也可能会快得多。

我开始尝试进行此翻译,但是由于您指定对hive-server2.log 进行多次重新解析,坦率地说,我迷路了。有一点输入和预期的输出会有所帮助...请发布hive-server2.log 和您的预期输出。

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2015-08-20
    • 2015-04-02
    • 1970-01-01
    相关资源
    最近更新 更多