首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取日志bash脚本时出错

读取日志bash脚本时出错
EN

Stack Overflow用户
提问于 2016-07-06 02:19:06
回答 1查看 41关注 0票数 0

我正在写的bash脚本有问题。我想读取一个日志文件,并对输出做一些处理。但问题是,它每次记录两行而不是一行。所以每次我得到输出的副本,而不是一行。

代码语言:javascript
复制
#!/bin/bash
##############

logfile=/var/atlassian/application-data/jira/log/atlassian-ing-security.log
counter_a=0
counter_b=0

tail -fn0 /var/atlassian/application-data/jira/log/atlassian-jira-   security.log | \
while read line ; do
    echo "$line" | grep "FAILED"
    if [ $? = 0 ]
    then
        echo "API action FAILED" >> $logfile
        counter_a=$((counter_a+1))
        echo "Total of $counter_a API actions FAILED" >> $logfile
    else
        echo "API action SUCCESFULL" >> $logfile
        counter_b=$((counter_b+1))
        echo "Total of $counter_b API actions SUCCESFULL" >> $logfile
    fi
 done

这是我在脚本中使用的输出:

代码语言:javascript
复制
2016-07-05 20:11:28,335 http-bio-8080-exec-2917 anonymous 1211x943864x1 - 10.000.000.113,10.000.105.000 /rest/api/2/search HttpSession created [10n1nec]
2016-07-05 20:11:28,381 http-bio-8080-exec-2917 AABBCC 1211x943864x1 - 10.000.000.000,10.000.105.000 /rest/api/2/search The user 'AABBCC' has PASSED authentication.

如何删除脚本中的每一次第二行?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-07-06 02:24:14

问题是grep的输出也会变成你的脚本的标准输出。您可以简单地将其静默:

代码语言:javascript
复制
if echo "$line" | grep -q FAILED; then
    echo "API action FAILED" >> $logfile
    counter_a=$((counter_a+1))
    echo "Total of $counter_a API actions FAILED" >> $logfile
else
    echo "API action SUCCESFULL" >> $logfile
    counter_b=$((counter_b+1))
    echo "Total of $counter_b API actions SUCCESFULL" >> $logfile
fi

但是,更好的方法是避免在每一行上调用(相对)昂贵的grep,而使用shell本身来检测匹配。

代码语言:javascript
复制
tail ... | {
  while read line ; do
    if [[ $line = *FAILED* ]]; then
    then
        echo "API action FAILED"
        counter_a=$((counter_a+1))
    else
        echo "API action SUCCESSFUL"
        counter_b=$((counter_b+1))
    fi
  done
  # You probably want to execute these just once, after the entire
  # file has been processed.
  echo "Total of $counter_b API actions SUCCESSFUL"
  echo "Total of $counter_a API actions FAILED"
} >> "$logfile"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38210079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档