Показать имя файла и номер строки в выводе grep

87

Я пытаюсь выполнить поиск в моем каталоге rails с помощью grep. Я ищу конкретное слово и хочу с помощью grep распечатать имя файла и номер строки.

Есть ли флаг grep, который сделает это за меня? Я пытался использовать комбинацию -nи, -lно они либо распечатывают имена файлов без номеров, либо просто выгружают на терминал много текста, который нелегко прочитать.

пример:

  grep -ln "search" *

Мне нужно передать его в awk?

trev9065
источник

Ответы:

138

Я думаю, что -lэто слишком ограничительно, так как подавляет вывод файлов -n. Я бы посоветовал -H( --with-filename): печатать имя файла для каждого совпадения.

grep -Hn "search" *

Если это дает слишком много вывода, попробуйте -oраспечатать только ту часть, которая соответствует.

grep -nHo "search" * 
говорил
источник
Этот ответ сработал и для меня. Мне потребовался рекурсивный поиск, и я использовал этот пример команды: grep -Hnor "localhost". Это список всех совпадений с именем файла и номером строки, кратким и лаконичным.
Тор Аурстад
Это также отображает результат, а не только имя файла и номер строки
elig
30
grep -rin searchstring * | cut -d: -f1-2

Это говорит о рекурсивном поиске (для строки searchstringв этом примере), игнорировании регистра и отображении номеров строк. Результат этого grep будет выглядеть примерно так:

/path/to/result/file.name:100: Line in file where 'searchstring' is found.

Затем мы передаем результат в команду cut, используя двоеточие в :качестве разделителя полей и отображая поля с 1 по 2.

Когда мне не нужны номера строк, которые я часто использую -f1(только имя файла и путь), а затем перенаправляю вывод uniq, чтобы я видел каждое имя файла только один раз:

grep -ir searchstring * | cut -d: -f1 | uniq
JBW
источник
1
Я считаю, что это лучший ответ на исходный вопрос. Только имена файлов и номера строк.
mastaBlasta
1
Обратите внимание, что это не работает, если у вас есть абсолютные пути к Windows, такие как `C: \ Users \ me \ git`, поскольку он уже содержит одно двоеточие.
hirse
19

Мне нравится использовать:

grep -niro 'searchstring' <path>

Но это только потому, что я всегда забываю другие способы и почему-то не могу забыть Роберта де grep -Ниро :)

Бас ван Оммен
источник
Никогда не думал, что получу голоса за вышеизложенное. Просто весело поделитесь. Благодарность! (Но это действительно работает - по крайней мере, на MacOS)
Бас ван Оммен
Люблю твой способ запомнить это!
Грег Хилстон
0

Комментарий от @ToreAurstad можно написать по буквам grep -Horn 'search' ./, что легче запомнить.

grep -HEroine 'search' ./ тоже может работать;)

Для любопытных:

$ grep --help | grep -Ee '-(H|E|r|o|i|n|e),'
  -E, --extended-regexp     PATTERNS are extended regular expressions
  -e, --regexp=PATTERNS     use PATTERNS for matching
  -i, --ignore-case         ignore case distinctions
  -n, --line-number         print line number with output lines
  -H, --with-filename       print file name with output lines
  -o, --only-matching       show only nonempty parts of lines that match
  -r, --recursive           like --directories=recurse
Иктус
источник
0

Вот как я использовал полученный ответ для поиска в дереве файлов fortran, содержащих строку:

find . -name "*.f" -exec grep -nHo the_string {} \;

Без nHo вы узнаете только, что какой-то файл где-то соответствует строке.

Карл И.
источник