Я пытаюсь выполнить поиск в моем каталоге rails с помощью grep. Я ищу конкретное слово и хочу с помощью grep распечатать имя файла и номер строки.
Есть ли флаг grep, который сделает это за меня? Я пытался использовать комбинацию -n
и, -l
но они либо распечатывают имена файлов без номеров, либо просто выгружают на терминал много текста, который нелегко прочитать.
пример:
grep -ln "search" *
Мне нужно передать его в awk?
Ответы:
Я думаю, что
-l
это слишком ограничительно, так как подавляет вывод файлов-n
. Я бы посоветовал-H
(--with-filename
): печатать имя файла для каждого совпадения.grep -Hn "search" *
Если это дает слишком много вывода, попробуйте
-o
распечатать только ту часть, которая соответствует.grep -nHo "search" *
источник
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
источник
Мне нравится использовать:
grep -niro 'searchstring' <path>
Но это только потому, что я всегда забываю другие способы и почему-то не могу забыть Роберта де
grep -
Ниро :)источник
Комментарий от @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
источник
Вот как я использовал полученный ответ для поиска в дереве файлов fortran, содержащих строку:
find . -name "*.f" -exec grep -nHo the_string {} \;
Без nHo вы узнаете только, что какой-то файл где-то соответствует строке.
источник