Часто требуется найти не файлы по названию, а строки в файлах или файлы, содержащие какую-то строку или регулярное выражение. Чтобы найти какую-либо строку во всех файлах в данном каталоге или рекурсивно по всем каталогам, нужно использовать команду grep.
grep — утилита командной строки, которая находит строки, отвечающие заданному регулярному выражению, и выводит их, если вывод не отменён специальным ключом. Название представляет собой акроним английской фразы «search globally for lines matching the regular expression, and print them» — «искать везде строки, соответствующие регулярному выражению, и выводить их».
Например:
1 |
grep -l 123abc *.html |
Эта команда выведет все названия файлов, содержащих “123abc” и имеющих расширение “html”.
Полное описание команды можно получить используя команду:
1 |
grep --help |
Пример поиска строки во всех вложенных файлах в данной папке (без рекурсии по вложенным папкам):
1 |
~/Desktop/Thesis: $ grep "topic" * |
Данная команда выведет все строки во всех вложенных папках, которые содержат слово “topic”
Пример поиска строки в файле:
1 |
grep 'Matthew' 1.txt |
Эта команда выведет все строки в файле 1.txt, содержащие слово ‘Matthew’.
Пример поиска строки во всех файлах рекурсивно по всем вложенным папкам:
1 |
grep -lr "text to find" * |
Здесь звездочка означает любой файл. -l выводит список файлов вместо строк, -r – рекурсия. Можно ставить как одинарные, так и двойные кавычки. Названия файлов тоже могут быть в кавычках, если содержат пробелы.
Пример простого поиска с регулярным выражением:
1 |
grep '^.*Contr.*$' 1.txt |
Данная команда выведет все строки из файла 1.txt, которые содержат сочетание(не обязательно слово) “Contr”. Каретка^ означает начало, доллар$ – конец. Точка(.) – любой символ, кроме новой строки, звездочка(*) – повторение предыдущего символа любое число раз.
Пример сложного поиска с регулярным выражением:
1 |
grep -ir ']*(face="sans-serif"|size="12")' *.htm *.html |
Здесь -i означает то, что grep будет case-insensitive. Все, что находится в одинарных кавычках – регулярное выражение, которое мы ищем. Команда ищет все htm и html файлы рекурсивно по всем папкам.
Если нужно сохранить результат поиска (список файлов) в файл, нужно дописать следующее:
1 |
... *.htm *.html >font_files.txt |
Если нужно отредактировать все файлы, содержащие подходящие строки, нужно просто команду заключить в кавычки след. образом:
1 |
vi 'grep -ir ']*(face="sans-serif"|size="12")' *.htm *.html' |
Источник информации для данной статьи:
http://hints.macworld.com/article.php?story=20001105214242629