Grep, показывающий имя файла и строку, найден

Мне нужна команда egrep, которые перечисляют все имена файлов, который содержит слова +, которые представляют ее в виде строки, нашел. Давайте вообразим этот сценарий:

Слова, которые я должен найти: apple, watermelon и banana.

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

./file1.txt:apple
./file1.txt:banana
./file2.txt:watermelon
./file5.txt:apple

Я не забываю видеть a grep команда, которая показывает FILENAME:STRING в результатах поиска, но я не могу помнить, как это было сделано. Я попробовал:

egrep -lr 'apple|banana|watermelon' .

Но результаты поиска показали:

./file1.txt
./file2.txt

Хорошо, это помогает, но... в file1, какое из слов это нашло? Это - проблема, с которой я сталкиваюсь.

3
задан 1 July 2015 в 12:28

4 ответа

Способ сделать это с awk:

awk -v var1=apple -v var2=banana -v var3=watermelon '{ if($0~var1) {print FILENAME":"var1} ; if($0~var2) {print FILENAME":"var2} ; if($0~var3) {print FILENAME":"var3}  }' *

В основном объявите 3 переменные, и 3, если операторы для печати имени файла и соответствующей переменной, которая была найдена

Править

Более короткая версия:

awk '/watermelon/{ print FILENAME":watermelon" }; /banana/{print FILENAME":banana"}; /apple/ {print FILENAME":apple"}' *

Основная идея находит /regular expression/ и выполните код в фигурных скобках после него, если найдено (который должен распечатать ИМЯ ФАЙЛА и которые представляют в виде строки, мы нашли).

3
ответ дан 17 November 2019 в 09:08

Вы использовали -l, который является противоположностью того, что Вы хотите. От man grep :

-l, --files-with-matches
      Suppress normal output; instead print the  name  of  each  input
      file  from  which  output would normally have been printed.  The
      scanning will stop on the first  match.   (-l  is  specified  by
      POSIX.)

то, Что Вы хотите, -H:

-H, --with-filename
      Print the file name for each match.  This is  the  default  when
      there is more than one file to search.

, Но это - значение по умолчанию так или иначе. Просто сделайте:

grep -Er 'apple|banana|watermelon' .

(Эти -E говорит grep действовать как egrep.)

14
ответ дан 17 November 2019 в 09:08

Вот команда, которую Вы ищете:

grep -R "apple\|banana\|watermelon" <search_path>

-R считает все файлы в соответствии с каждым каталогом в search_path, рекурсивно. Имя файла будет отображено для каждого соответствия.

3
ответ дан 17 November 2019 в 09:08

Следующее даст Вам вывод, который Вы хотите (использующий удар):

for x in apple banana watermelon ; do grep $x * ; done

вывод даст Вам всем строки, содержащие строку поиска.

следующее даст Вам только строку поиска, как произведено:

for x in apple banana watermelon ; do grep -l $x * |xargs -I{} echo {}:$x; done
2
ответ дан 17 November 2019 в 09:08

Другие вопросы по тегам:

Похожие вопросы: