Перенаправить вывод команды grep в файл
Я не уверен, почему, что редирект в коде не работает. Каждый раз, когда я запускаю скрипт, выходной файл всегда пуст. У кого-нибудь есть идея?
спасибо.
#!/bin/sh
LOOK_FOR="DefaultProblem"
FILES=`ls plugins/*source*.jar`
for i in $FILES
do
# echo "Looking in $i ..."
unzip -p $i | grep -i $LOOK_FOR > output #> /dev/null
if [ $? == 0 ]
then
echo ">>>> Found $LOOK_FOR in $i <<<<"
fi
done
4 ответов
вы можете использовать >>
(добавление) вместо >
(затирка) для перенаправления как:
unzip -p $i | grep -i $LOOK_FOR >> output #> /dev/null
поскольку вы выполняете эту команду в цикле и перезаписи файла output
каждый раз может быть пустым в конце если последняя команда с grep не находит соответствующей строки в выводе распаковать.
у вас три проблемы
- не пытайтесь анализировать вывод
ls
. Вместо этого просто используйтеfor i in plugins/*source*.jar
основная причина заключается в том, что ваш скрипт полностью и полностью сломается на любых файлах с пробелами в их именах. См.этой ссылке по множеству причин, почему бы не разобратьls
- вам нужно использовать
>>
вместо>
поскольку последний перезапишет выходной файл на каждой итерации цикла. Бывший добавить это - использовать больше цитат! Вы захотите указать свои переменные, чтобы убедиться, что они не подвергаются разбиению на слова
кроме того, вы можете встроить
вы можете перенаправить вывод всего цикла:
#!/bin/sh
LOOK_FOR="DefaultProblem"
FILES=`ls plugins/*source*.jar`
for i in $FILES ; do
# echo "Looking in $i ..." 1>&2
unzip -p $i | grep -i $LOOK_FOR
if [ $? == 0 ] ; then
echo ">>>> Found $LOOK_FOR in $i <<<<" 1>&2
fi
done > output
обратите внимание, что я перенаправил диагностические сообщения на stderr.
вместо for loop
и if conditional
вы можете сделать все в одном find
команда
find /path/to/plugins -name "*source*.jar" -exec sh -c 'unzip -l "{}" | grep -q DefaultProblem' \; -print