2014-02-28 131 views
0

我想創建一個腳本,當運行時,將訪問/ var/log/secure文件並報告當天發生了多少次失敗嘗試,將輸出追加到名爲failed的文件中格式:Linux重定向幫助需要

日期:14年2月15日時間:10:3​​0號失敗的嘗試:8

和輸出應該使用文件重定向腳本內部完成,因此標準輸出進入failed.log和標準錯誤進入error.log文件。

我的代碼(test.sh)是這樣的:

#!/bin/bash 
for i in $(date) 

do 
mdy=$($i "+%m/%d/%Y) 
md=$($i "+%m %d") 
tme=$($i "+ H:%M) 
fail=$(grep Failed /var/log/secure | grep $md | wc -l 

echo "Date: $mdy Time: $tme Number of failed attempts: $fail" 

done 

我在做什麼錯?

我做了for循環考慮我將是日期命令和mdy將顯示mm/dd/yy,tme將是HH:MM和md將用於grep var/log/secure爲失敗登錄。

一旦我得到我想要的輸出,我將能夠通過 做重定向SH test.sh> failed.log 2> error.log中

+2

順便說一句,'grep -c'相當於'grep | wc -l'。 – kojiro

+0

'這應該做什麼?$($ i「+%m /%d /%Y」)? – Alfe

+0

對於這個問題,'for'循環甚至做什麼?你循環當前'日期'輸出的組件......? – nneonneo

回答

0

也許你正在尋找這樣的事情?我真的不知道你希望如何解析它,但使用這些變量你可以像你那樣做。然而,我相信,你的for循環並沒有做你想做的事。

#!/bin/bash 
set -- $(date) 
DAYNAME=$1; MONTH=$2; DAY=$3; TIME=$4; YEAR=$6 
ATTEMPTS=$(grep -iw 'Failed\|$2\|$3' /var/log/secure | wc -l) 
echo "Date: $MONTH $DAY $YEAR Time: $TIME Number of failed attempts: $ATTEMPTS" 
+0

「set - $(date)'然後'DAYNAME = $ 1;個月= $ 2;天= $ 3; TIME = $ 4; YEAR = $ 6' – tripleee

+0

謝謝tripleee。 OP,請嘗試更改。 – wbt11a

0

如果問題是關於重定向,我這樣做是這樣的:

#!/bin/bash 

THIS_SCRIPT_NAME=$(basename $0) 
LOG_DIR='/var/log' 
DATE_POSTFIX=$(date '+_%Y_%m_%d_%H_%M_%S') 
LOG_FILE="${LOG_DIR}/${THIS_SCRIPT_NAME}${DATE_POSTFIX}.log" 

if [ ! -d "$LOG_DIR" ]; then 
     mkdir -p "$LOG_DIR" 
fi 

exec 1>>"$LOG_FILE" 2>&1 
0

只是去除不必要的部分和固定還剩下些什麼,你的腳本可能會是這樣的。如果您只想處理單個日期,則不需要for循環。

#!/bin/bash 
mdy=$(date "+%m/%d/%Y") 
md=$(date "+%m %d") 
tme=$(date "+%H:%M") 
# Assuming the date stamp always precedes the message 
fail=$(grep -c "$md.*Failed" /var/log/secure) 
echo "Date: $mdy Time: $tme Number of failed attempts: $fail" 

沒有什麼可以出錯的;主要是,如果您沒有對/var/log/secure的讀取訪問權限,或者它不存在,則標準錯誤將包含消息。

有幾種方法可以避免多次撥打date,但這不會成爲此處的性能瓶頸。