Мне нужна команда 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
, какое из слов это нашло? Это - проблема, с которой я сталкиваюсь.
Способ сделать это с 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/
и выполните код в фигурных скобках после него, если найдено (который должен распечатать ИМЯ ФАЙЛА и которые представляют в виде строки, мы нашли).
Вы использовали -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
.)
Вот команда, которую Вы ищете:
grep -R "apple\|banana\|watermelon" <search_path>
-R считает все файлы в соответствии с каждым каталогом в search_path, рекурсивно. Имя файла будет отображено для каждого соответствия.
Следующее даст Вам вывод, который Вы хотите (использующий удар):
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