Показувати ім’я файлу та номер рядка у вихідних даних grep


87

Я намагаюся здійснити пошук у моєму каталозі рейок за допомогою grep. Я шукаю конкретне слово, і хочу grep, щоб роздрукувати ім'я файлу та номер рядка.

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

напр .:

  grep -ln "search" *

Чи потрібно мені переводити його в трубу?


Відповіді:


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

1
Я вважаю, що це найкраще відповідає на вихідне питання. Тільки імена файлів та номери рядків.
mastaBlasta

1
Зверніть увагу, що це не працює, якщо у вас є абсолютні назви шляхів Windows, наприклад `C: \ Users \ me \ git`, оскільки вона вже містить одну двокрапку.
прокат

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 ви дізнаєтесь лише про те, що якийсь файл десь відповідає рядку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.