Всем привет.
Прошу вашей помощи товарищи. Имеется скрипт, который парсит текстовый файл и необходимое из него отправляет по ftp. Вот вырезка
[spoiler] touch $HOME/$LOCK_FILE
for hostnm in `cat $ftphostsfile`;
do
if [ `cat $HOME/$CUR_DATA_FILE | grep '#####'` ] ; then
DebugMsg "Detected SBROS in EMS-XDM"
break
fi
cat $HOME/$CUR_DATA_FILE | grep -v 2M | sed 's/EMS/EMS-XDM/' >> "alarm_$hostnm.dat"
cat $HOME/$CUR_DATA_FILE | sed 's/EMS/EMS-XDM/' >> "alarm_SDH.log"
if [ $? != 0 ]; then
ErrorMsg "Can't append file alarm_$hostnm.dat"
exit
fi
done
/bin/rm $HOME/$CUR_DATA_FILE
/bin/rm $HOME/$LOCK_FILE
fi
[/spoiler]
Когда скрипт выполняет это if [ `cat $HOME/$CUR_DATA_FILE | grep '#####'` ] ; then и находит в нем только одну строчку с #####, то он действует так как этого и нужно. Но бывают косяки и в файле появляются несколько строчек с #####, в этом случаи скрипт выдает
/opt/XDM/sh/ftpSend_V8_03: test: unknown operator #####
и завершается с ошибкой.
Может как-то поможете советом или еще чем как этого избежать?
Зачем делать cat file | grep когда grep сам умеет в файл смотреть? А вдруг файл гигабайтных размеров, тогда скрипту будет нехорошо.
Как вариант сделать
if [ $(grep -c '#####' $HOME/$CUR_DATA_FILE) -gt 1 ] ; then
Хотя тут ожидется что grep выдаст число. Если например файл не найден то grep выдаст текстовое сообщение об ошибке
которое поломает сравнение.
Но с другой стороны вначале нужно проверять наличие лог файла.
Цитата: sotrud_nik от 10 Января 2014, 09:26if [ $(grep -c '#####' $HOME/$CUR_DATA_FILE) -gt 1 ] ; then
ЦитироватьЦЕЛОЕ1 -ge ЦЕЛОЕ2
ЦЕЛОЕ1 больше или равно ЦЕЛОЕ2
ЦЕЛОЕ1 -gt ЦЕЛОЕ2
ЦЕЛОЕ1 больше ЦЕЛОЕ2
Спасибо я думаю -ge мне больше подойдет. Это реально косяк моего корявого кода. Обсолютно верно сразу grep лучше делать, правильнее. Где-то в начале есть проверка на существование такого файла. Как изменю, не раньше понедельника, что бы на выходных работало, сразу отпишусь.
а зачем вам ввобще счетчик (grep -c)? разве не достаточно проверки простого наличия (grep -q)?
т.е.
if `grep -q '#####' $HOME/$CUR_DATA_FILE`; then echo 'тырым-пырым'; esle echo 'пырым-тырым'; fi