Мне нужно проверить мои файлы журналов:
-Все новые строки журнала должны начинаться с даты.
-Данная дата будет соответствовать стандарту ISO 8601. Пример:
2011-02-03 12: 51: 45,220Z -
Используя сценарий оболочки, я могу проверить его зацикливание на каждой строке и проверку шаблона даты.
Код ниже:
#!/bin/bash
processLine(){
# get all args
line="$@"
result=`echo $line | egrep "[0-9]{4}-[0-9]{2}-[0-9]{2} [012][0-9]:[0-9]{2}:[0-9]{2},[0-9]{3}Z" -a -c`
if [ "$result" == "0" ]; then
echo "The log is not with correct date format: "
echo $line
exit 1
fi
}
# Make sure we get file name as command line argument
if [ "$1" == "" ]; then
echo "You must enter a logfile"
exit 0
else
file="$1"
# make sure file exist and readable
if [ ! -f $file ]; then
echo "$file : does not exists"
exit 1
elif [ ! -r $file ]; then
echo "$file: can not read"
exit 2
fi
fi
# Set loop separator to end of line
BAKIFS=$IFS
IFS=$(echo -en "\n\b")
exec 3<&0
exec 0<"$file"
while read -r line
do
# use $line variable to process line in processLine() function
processLine $line
done
exec 0<&3
# restore $IFS which was used to determine what the field separators are
IFS=$BAKIFS
echo SUCCESS
Но есть проблема. Некоторые журналы содержат трассировки стека или что-то, что использует более одной строки, другими словами, стек трассировки является примером, это может быть что угодно . Пример стека:
2011-02-03 12:51:45,220Z [ERROR] - File not found
java.io.FileNotFoundException: fred.txt
at java.io.FileInputStream.<init>(FileInputStream.java)
at java.io.FileInputStream.<init>(FileInputStream.java)
at ExTest.readMyFile(ExTest.java:19)
at ExTest.main(ExTest.java:7)
...
не пройдет с моим скриптом, но действует!
Затем, если я запускаю свой сценарий, передавая, например, файл журнала со трассировкой стека, мой сценарий завершится сбоем, потому что он циклически переходит в строку.
У меня правильный шаблон, и мне нужно проверить формат даты в регистраторе, но у меня нет неправильного шаблона формата даты для пропуска строк.
Я не знаю, как я могу решить эту проблему. Кто-нибудь может мне помочь?
Спасибо