用于解析日志文件的Shell脚本

时间:2011-08-02 20:15:41

标签: linux shell

我正在编写一个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'。

3 个答案:

答案 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.