Найти строку в файле в файловой системе с помощью GREP

Вы были очень близко:

i=0
while [ $i -le 4 ]; do
  alias "c$i"="ssh computer-1-$i"
  i=`expr $i + 1`
done

Просто добавьте символ $ перед i внутри цикла while .

3
01.11.2018, 14:37
1 ответ

Чтобы найти строку (, не являющуюся регулярным выражением ), без учета регистра, используйте grep -iF STRING(, где STRINGдолжна быть искомая строка в кавычках ).

Чтобы просмотреть все обычные файлы в иерархии каталогов, выполните

find. -type f -exec grep -iF STRING /dev/null {} +

Основное различие между этой и вашей командой заключается в том, что она будет выполняться grepдля групп найденных файлов. Ваша команда будет выполняться grepодин раз для каждого найденного файла, что может быть медленнее, если файлов много. Разница заключается в +в конце.

Другое отличие состоит в том, что, поскольку grepвызывается более чем с одним файлом, его вывод будет содержать пути к файлам, в которых найдены совпадения. /dev/nullпредназначен для принудительного такого поведения в случае, если grepвызывается только с одним файлом. Вы можете использовать опцию grep-Hвместо включения /dev/null, если ваша реализация grepимеет эту не -стандартную (, но общую опцию ).

Некоторые реализации grepтакже имеют возможность рекурсии каталогов без помощи find. Это часто делается с помощью опции -R:

.
grep -R -iF STRING.

Обратите внимание, что GNU grepтакже имеет параметр -r, который немного отличается от его параметра -R-r, символические ссылки не будут использоваться, что будет более точно имитировать поведение, которое вы выполняете. d получить с запуском grepчерезfind. -type f).


Если вам нужно найти только пути к файлам, которые содержат строку, а не обязательно фактические строки из тех файлов, которые соответствуют, то вы можете сделать это несколькими различными способами (все в основном аналогично тому, что упомянуто выше ).

  • Используйте grep -qв качестве теста для каждого файла:

    find. -type f -exec grep -qiF STRING {} ';' -print
    
  • Используйте grep -lдля групп файлов, найденных с помощьюfind:

    find. -type f -exec grep -ilF STRING {} +
    
  • Использовать рекурсивноеgrep -l:

    grep -R -ilF STRING.
    

Если вы хотите выполнить дальнейшую обработку файлов, содержащих данную строку, я бы выбрал первый из этих вариантов:

find. -type f -exec grep -qiF STRING {} ';' -exec sh -c '
    for pathname do
        # Process "$pathname" here
    done' sh {} +

или, выполняя grepвнутри строчного скрипта -:

find. -type f -exec sh -c '
    for pathname do
        if grep -qiF STRING "$pathname"; then
            # Process "$pathname" here
        fi
    done' sh {} +

Связанные:

6
27.01.2020, 21:12

Теги

Похожие вопросы