Лучший способ поиска строки в файле?

3395
eleven81

Я пытаюсь найти определенную строку текста в файле где-то на моем жестком диске. Лучшее, что я придумал, это:

find -type f / | xargs cat | grep "string to find" 

Но это просто говорит мне, существует ли строка где-то или нет.

Как я могу узнать, в каком файле я его нашел?

Есть ли способ лучше?

0

6 ответов на вопрос

5
DrFredEdison

Это должно сделать свое дело и намного проще:

grep -R "some string" / 

добавление -n покажет вам номера строк, которые вам нужны:

grep -Rn "some string" / 
4
John T
find / -type f -exec grep "string" {} + 

Это выполнит поиск без учета регистра, который будет медленнее, но более гибким:

find / -type f -exec grep -i "string" {} + 

вы можете получить много результатов, так что вы можете направить их к меньшему количеству, а затем использовать fи bдля перемещения вперед и назад страница за страницей через выходные данные:

find / -type f -exec grep -i "string" {} + | less 

Если вы знаете, что ищете *.txtфайлы, вы можете уточнить это еще больше:

find / -type f -name "*.txt" -exec grep -i "string" {} + | less 
4
davr

Зачем вообще использовать «кошку» в этом случае? Я всегда нахожу странным, как люди используют «кошку» без всякой причины. Просто делать:

find -type f / | xargs grep "string to find" 

Конечно, поиск каждого файла на вашем диске будет очень медленным. Возможно, вам лучше использовать какую-то программу индексирования, если вам часто приходится искать подобным образом. Например, Beagle - довольно обширная поисковая система, она существует уже некоторое время. Другие варианты - KDE Strigi или Google Desktop.

По крайней мере, вы должны использовать «locate» вместо «find», он только индексирует имена файлов, а не их содержимое, но это все равно ускорит процесс. Кроме того, вы должны фильтровать по типу файла, прежде чем использовать grep. Например, использование grep для файла avi размером 100 МБ или чего-то другого - просто трата времени.

2
akira

как насчет:

grep -r -H -i 'string' . 
2
nik

Как я могу узнать, в каком файле я его нашел?

Вам необходимо использовать -Hопцию ' grep' с ' ' для печати соответствующего файла.


Также,

  • Также было бы неплохо использовать чуть более правильное предположение, чем корень (' /').
  • JohnСхема -execпереключения |оператора ' ' поможет, когда у вас много файлов, которые ищут
+1 - Вам почти никогда не нужно начинать поиск с `/`. Также стоит сказать, что если вы запустите поиск, начинающийся с `/` как обычный пользователь, вы получите массу сообщений об ошибках из-за проблем с разрешениями. Telemachus 14 лет назад 3
grep -H не будет работать в этом случае из-за его избыточного использования 'cat'. было бы просто напечатать 'stdin'. Теперь, если он не использовал 'cat', то по умолчанию grep должен напечатать, к какому файлу он соответствует, поэтому ему не понадобится дополнительный флаг. davr 14 лет назад 2
1
Lee B

Да, grep с флагом -r будет искать рекурсивно. Попробуйте команду как:

grep -ri 'hello' . 

Который будет искать в текущем каталоге и во всех файлах и каталогах внутри него фразу «привет». Флаг -i делает его независимым от регистра, поэтому он также найдет «Hello», «HELLO» и т. Д.