Перенаправить вывод команды 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 не находит соответствующей строки в выводе распаковать.


у вас три проблемы

  1. не пытайтесь анализировать вывод ls. Вместо этого просто используйте for i in plugins/*source*.jar основная причина заключается в том, что ваш скрипт полностью и полностью сломается на любых файлах с пробелами в их именах. См.этой ссылке по множеству причин, почему бы не разобрать ls
  2. вам нужно использовать >> вместо > поскольку последний перезапишет выходной файл на каждой итерации цикла. Бывший добавить это
  3. использовать больше цитат! Вы захотите указать свои переменные, чтобы убедиться, что они не подвергаются разбиению на слова

кроме того, вы можете встроить


вы можете перенаправить вывод всего цикла:

#!/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