Egrep — Поиск по нескольким словам, а также ограничение типа файла

#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? Причина, по которой я спрашиваю, заключается в том, что иногда этот поиск приходится выполнять на сетевом диске с большим количеством файлов и каталогов, поэтому, казалось бы, было бы идеально, если бы я мог сделать это один раз, а не дважды, если это возможно. Еще раз спасибо, Алан.