#string #search #grep #file-type
#строка #Поиск #grep #тип файла
Вопрос:
Я пытаюсь выполнить поиск по сетевой папке с помощью egrep, но это работает не так, как я надеялся.
Я пытаюсь выполнить поиск текстовых документов (файлов только с расширением txt), которые содержат как string1, так и string2, таким образом:
egrep -wir --include=*.txt 'string1' * | egrep -wir --include=*.txt 'string2' * > listofiles.txt
Однако я получаю результаты из файлов, которые имеют другие расширения (например, файлы .php).
Кто-нибудь может сказать мне, чего мне не хватает?
Спасибо,
Алан.
Ответ №1:
Вы передаете выходные данные первого egrep во второй egrep, что означает, что вы обрабатываете выходные данные первого egrep, а не файлы, которые он возвращает. Если все, что вам нужно, это файлы, содержащие как string1, так и string2, простым решением является запуск обоих egrep в один и тот же файл, затем сортировка, uniq и повторная сортировка:
egrep -wirl --include=*.txt 'string1' * > listoffiles.txt
egrep -wirl --include=*.txt 'string2' * >> listoffiles.txt
sort listoffiles.txt | sort | uniq -c | sort
Все, что имеет значение 2, — это то, что вы ищете.
Примечание: флаг egrep -l подавляет обычный вывод и выдает только имя файла
Примечание: флаг uniq -c позволяет подсчитать, сколько вхождений строки было найдено
Комментарии:
1. Привет, Цифра — Не уверен, что понимаю. Команда в моей операционной системе успешно выдает мне все файлы, которые содержат как string1, так и string2. Проблема в том, что я хочу проверять только файлы с расширением txt. Однако то, что вы говорите, заставляет меня задуматься, возможно, мне следует ограничить тип файла только в первом egrep, но не во втором? Я не могу попробовать это отсюда, поэтому я смогу протестировать и опубликовать ответ только завтра. Спасибо, Алан.
2. Привет — В том, что я делаю, есть что-то более фундаментально неправильное. Эта команда (не уверен, как правильно отформатировать ее в этих маленьких ответах, которые мы должны использовать, поэтому я «оберну» ее в двойные крестики): XXegrep -wir —include=*.txt ‘string1’ * > listoffiles.txtXX по-прежнему выдает мне php-файлы (а также txt-файлы), так что, похоже, моя проблема не в канале? Спасибо, Алан.
3. Привет — Пожалуйста, обратите внимание, что форум удаляет косую черту после знака равенства, и я не могу заставить ее отображаться в сообщении — однако она есть, когда я использую команду. Спасибо, Алан.
4. Вы уверены, что понимаете, как работает egrep? egrep возвращает имя файла, а затем строку, которая соответствовала вашему запросу. Передавая один egrep в следующий egrep, вы просто выполняете grep для соответствующих строк, а не для самих файлов.
5. Привет, Числовой — я не был, но благодаря вам теперь я лучше понимаю 🙂 Итак, нет ли способа достичь того, что я хочу сделать, с помощью «одного прохода», вместо запуска двух отдельных egrep? Причина, по которой я спрашиваю, заключается в том, что иногда этот поиск приходится выполнять на сетевом диске с большим количеством файлов и каталогов, поэтому, казалось бы, было бы идеально, если бы я мог сделать это один раз, а не дважды, если это возможно. Еще раз спасибо, Алан.