2015-06-01 5 views
0

У меня есть требование распечатать все имя файла и номер строки, содержащие текст.find и grep и распечатать имя файла и номер строки

find . -name '*.cpp' -exec grep -n 'HELLO' {} \; > output.txt 

, но это только печать содержимого и номера строки, а не имя файла. Как его достичь? Я делаю это на Solaris.

+0

Вы хотите, чтобы содержание или только имя файла? –

+0

только номер строки и имя файла. – CrazyC

+0

Вам нужен рекурсивный поиск или все файлы в текущем каталоге? –

ответ

0

Вам нужно еще один аргумент: Grep

-H, --with-filename 
      Print the filename for each match. 

Я не вижу способ исключить текст согласования с выхода в Grep. Возможно, вам придется снова фильтровать ваш результат.

+1

К сожалению, это нестандартная опция, поэтому может быть недоступна. –

+0

does greys поддерживают greis эти параметры? – 1010

0

Почему бы вам не использовать опцию "-r" из "Grep" выглядит внутри файлов:

find . -name '*.cpp' | grep -n -r HELLO > output.txt 
+0

это будет выход grep find (т. Е. Список имен файлов) – 1010

+0

Grep откроется и просмотрит файлы, найденные с помощью «find». Thi - это то, что предоставляет опция «-r». –

+0

, это будет так, если вы выполните grep со списком файлов. в этом случае вы выводите вывод find на grep, поэтому grep будет обрабатывать свой стандартный ввод. – 1010

4

Вот вариант с использованием AWK вместо Grep:

find . -name '*.cpp' -exec awk '/HELLO/ { print FILENAME, NR }' {} + > output.txt 

Всякий раз шаблон сопоставляется, печатаются имя файла и номер строки. Я использовал -exec {} +, так что несколько имен файлов передаются в качестве аргументов для одного вызова awk, что должно быть быстрее, если у вас много файлов для поиска.

1

Если ваш grep не поддерживает опцию -H (для grep на Solaris 10 нет), типичным обходным решением является добавление файла /dev/null в командную строку grep. Этот файл не будет соответствовать никому, но поскольку в командной строке есть два или более файлов, grep будет отображать имена файлов в своем выводе.

find . -name '*.cpp' -exec grep -n 'HELLO' /dev/null {} \; > output.txt 
0

вы можете попробовать

grep -n 'HELLO' `find . -name '*.cpp'` > output.txt 

я не могу проверить его на Солярис, так что я не уверен, что это будет работать.

0

Позвольте grep посмотреть в 2 файлах. Обычно я использую/etc/passwd, но/dev/null лучше:

find . -name '*.cpp' -exec grep -n 'HELLO' {} /dev/null \; > output.txt 
Смежные вопросы