我正在编写一个shell脚本来解析日志文件并拔出sudo成功和/或失败的所有实例。我现在意识到,使用shell相当于正则表达式可能会更容易,但我不想花时间去挖掘(现在我付出了代价)。无论如何:
sudobool=0
sudoCount=0
for i in `cat /var/log/auth.log`;
do
for word in $i;
do
if $word == "sudo:"
then
echo "sudo found"
sudobool=1;
sudoCount=`expr $sudoCount + 1`;
fi
done
sudobool=0;
done
echo "There were " $sudoCount " attempts to use sudo, " $sudoFailCount " of which failed."
所以,我对我编写的代码的理解:读取auth.log并逐行拆分,存储在i中。检查i中的每个单词以查看它是否为sudo:如果是,我们翻转bool并递增。完成解析后,重置bool并移动到下一行。
但是,根据我的输出判断,shell正在尝试执行日志文件的单个单词,通常返回'$ word:not found'。
答案 0 :(得分:4)
为什么不为此使用grep?
grep sudo /var/log/auth.log
如果你想要一个计数管道到wc -l </ p>
grep sudo /var/log/auth.log | wc -l
或者更好的是使用-c选项来grep,它打印出包含sudo的行数
grep -c sudo /var/log/auth.log
或者我在这里错过了一些简单的东西?
编辑:滚动后我看到$ sudoFailCount,你想计算使用sudo失败的尝试次数?您没有在脚本中为$ sudoFailCount定义任何值,因此它不会打印任何内容。此外,您在if条件检查
test
括号[[ ]]
答案 1 :(得分:1)
您的错误消息来自if
声明中缺少语法:您需要将条件放在[[方括号]]
在bash中使用模式匹配:
#!/bin/bash
sudoCount=0
while read line; do
sudoBool=0
if [[ "$line" = *sudo:* ]]; then
sudoBool=1
(( sudoCount++ ))
# do something with sudobool ?
fi
done < /var/log/auth.log
echo "There were $sudoCount attempts to use sudo."
我并不是非常熟悉auth.log - 确定成败的模式是什么?
答案 2 :(得分:1)
扩展Sudhi的回答,这是一个单行:
$ echo "There were $(grep -c ' sudo: ' /var/log/auth.log) attempts to use sudo, $(grep -c ' sudo: .*authentication failure' /var/log/auth.log) of which failed."
There were 17 attempts to use sudo, 1 of which failed.