вызов grep из скрипта bash - PullRequest
       23

вызов grep из скрипта bash

0 голосов
/ 03 октября 2009

Я новичок в скриптах bash (и в целом * nix shell), но я пытаюсь написать этот скрипт, чтобы упростить поиск кода.

Я написал это

#!/bin/bash
args=("$@");
for arg in args
 grep arg * */* */*/* */*/*/* */*/*/*/*;
done

когда я пытаюсь запустить его, вот что происходит:

~/Work/richmond $ ./f.sh "\$_REQUEST\['a'\]"
./f.sh: line 4: syntax error near unexpected token `grep'
./f.sh: line 4: `       grep arg * */* */*/* */*/*/* */*/*/*/*;'
~/Work/richmond $

Как мне сделать это правильно?

И, я думаю, что более важный вопрос заключается в том, как я могу сделать так, чтобы grep рекурсивно проходил через подкаталоги следующим образом?

Любые другие советы и / или подводные камни, связанные с использованием сценариев оболочки и использованием bash в целом, также приветствуются.

Ответы [ 6 ]

9 голосов
/ 03 октября 2009

Синтаксическая ошибка в том, что вам не хватает do. Что касается рекурсивного поиска, если у вашего grep есть опция -R, вы должны сделать:

#!/bin/bash
for arg in "$@"; do
   grep -R "$arg" *
done

В противном случае вы можете использовать find:

#!/bin/bash
for arg in "$@"; do
   find . -exec grep "$arg" {} +
done

В последнем примере find выполнит grep и заменит скобки {} найденными им именами файлов, начиная с текущего каталога ..

(Обратите внимание, что я также изменил arg на "$arg". Вам нужен знак доллара, чтобы получить значение переменной, а кавычки говорят оболочке обрабатывать ее значение как одно большое слово, даже если $arg содержит пробелы или новые строки.)

3 голосов
/ 03 октября 2009

При рекурсивном подборе:

В зависимости от вашей версии grep, вы можете передать -R своей команде grep, чтобы она выполняла рекурсивный поиск (в подкаталогах).

1 голос
/ 03 октября 2009

Вы должны использовать 'find' плюс 'xargs' для поиска файлов.

for arg in "$@"
do
    find . -type f -print0 | xargs -0 grep "$arg" /dev/null
done

Опции '-print0' и '-0' предполагают, что вы используете GNU grep и гарантируют, что скрипт работает, даже если в ваших путевых именах есть пробелы или другие неожиданные символы. Использование xargs подобным образом более эффективно, чем find для его выполнения для каждого файла; /dev/null появляется в списке аргументов, поэтому grep всегда сообщает имя файла, содержащего совпадение.

Вы можете решить упростить жизнь - возможно, - объединив все поиски в один, используя egrep или grep -E. Оптимизация будет заключаться в том, чтобы захватить вывод из find один раз и затем передать его в xargs на каждой итерации.

1 голос
/ 03 октября 2009

Лучшее решение указано выше, но попробуйте поставить свое утверждение в обратном тике:

`grep ...`
0 голосов
/ 18 сентября 2011

Если вы просто хотите получить лучший grep и не хотите ничего делать самостоятельно, используйте ack, который вы можете получить по адресу http://betterthangrep.com/.

0 голосов
/ 12 октября 2009

Взгляните на сценарий findrepo , который может дать вам несколько указателей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...