阅读日志bash脚本时出错
问题描述:
我遇到了一个我正在写的bash脚本的问题。我想读取一个日志文件并对输出做些什么。但问题是它每次都会记录两行而不是一行。所以每次我得到一份输出而不是一行。阅读日志bash脚本时出错
#!/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
这是我使用的脚本输出:
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.
如何删除每次在脚本的第二行?
谢谢!
答
问题是,grep
的输出也会转到脚本的标准输出。你可以简单地压制它:
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本身来检测匹配。
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"
谢谢。唯一的问题是脚本必须连续运行而不是一次扫描。所以每次有人执行api时,脚本都必须将其记录到外部文件中。 –
如果您确实需要在每行之后记录一次运行计数,则可以从我显示的第一个片段中保留该部分,然后使用'[[...]]'命令替换'grep'管道。 – chepner
令人遗憾的是,它保持记录两行而不是一行..我不明白它,因为它的第一行没有任何创建的语法.... –