2011-08-02 72 views
1

我正在编写一个shell脚本来解析日志文件,并提取sudo成功和/或失败的所有实例。我现在意识到,使用shell的正则表达式可能会更容易,但我不想花时间去挖掘(现在我正在付出代价)。无论如何:用于解析日志文件的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并逐行分解,这是存储在我。我检查每个单词是否是sudo,如果是,我们翻转bool并增加。一旦我们完成了解析该行,重置bool并移动到下一行。

然而,根据我的输出判断,shell正试图执行日志文件的单个单词,通常返回'$ word:not found'。

回答

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." 

我不initimately熟悉auth.log - 什么是决定成败的模式?

4

为什么你不使用grep这个?

grep sudo /var/log/auth.log 

如果你想有一个计数管它WC -l

grep sudo /var/log/auth.log | wc -l 

或静止更好地使用-c选项给grep,打印多少行被发现含有须藤

grep -c sudo /var/log/auth.log 

或者我错过了一些简单的东西?
编辑:滚动后,我看到$ sudoFailCount,你想计算有多少失败的尝试使用sudo?您尚未在脚本中为$ sudoFailCount定义任何值,因此它不会打印任何内容。你还缺少test括号[[ ]]围绕你,如果条件检查

+0

所有伟大的补充,我的知识基础。谢谢! –

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.