2011-08-02 115 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.