используя вывод команды grep для поиска команды - PullRequest
0 голосов
/ 27 апреля 2011

У меня проблема с поиском шаблона среди нескольких файлов.

Я хочу выполнить поиск "Регистратор".шаблон в файлах jsp, поэтому я использовал команду

grep -ir Logger. * | find . -name *.jsp

Теперь проблема, с которой я сталкиваюсь, заключается в том, что эта команда выводит список всех файлов jsp и не ищет шаблон «Logger».в jsp файлах и перечисляя их.

Я просто хочу jsp файлы, в которых "Logger".экземпляр присутствует.

Ответы [ 4 ]

2 голосов
/ 27 апреля 2011

начать так Вы хотите искать в файлах JSP.

find . -name "*.jsp"

вышеизложенное будет выводить все файлы JSP рекурсивно из текущего каталога. как ниже

1/2/ahbd.jsp
befwej/dg/wefwefw/wefwefwe/ijn.jsp

А теперь вы хотите найти строку только в этих файлах.

grep -ir Logger. (output of find)

, поэтому фактическая команда завершения становится:

find . -name "*.jsp"|xargs grep -ir 'Logger.'

магия здесь сделана xargs он выдает вывод find в качестве ввода для grep строка за строкой. если вы удалите xargs, то строка будет искать только первую строку 1/2/ahbd.jsp.

Есть несколько других способов сделать это. Но я чувствую себя более комфортно, используя это регулярно

1 голос
/ 27 апреля 2011

Чтобы рекурсивно найти все *.jsp файлы, содержащие строку Logger., вы можете сделать:

find . -type f -name '*.jsp' -exec grep -l "Logger\." {} \;

grep -l означает печать только имени файла, если файл содержит строку.
Переключатель -exec find выполнит данную команду для каждого файла, соответствующего другим критериям (-type f и -name '*.jsp'). Строка {} заменяется именем файла. Некоторые версии find также поддерживают + вместо {} для подачи в команду нескольких имен файлов (как это делает xargs), а не только по одному, например ::

find . -type f -name '*.jsp' -exec grep -l "Logger\." + \;
0 голосов
/ 27 апреля 2011

Если у вас есть bash 4 +

shopt -s globstar
shopt -s nullglob
for file in **/*.jsp
do
  if grep -q "Logger." "$file" ;then
    echo "found in $file"
  fi
  # or just grep -l "Logger." "$file"
done
0 голосов
/ 27 апреля 2011

Вы можете просто использовать grep для этого, вот команда, которая должна дать вам результаты:

grep -ir "Logger\." * | grep ".jsp"

Проблема в том, что grep будет запускаться, когда вы используете " .jsp" или " ", если у вас нет хотя бы одного .jsp файла в корневой каталог.Поэтому мы должны сказать ему, чтобы он просматривал каждый файл.

Поскольку вы даете grep аргумент -r (рекурсивный), он пройдет по подкаталогам, чтобы найти шаблон "Logger.", Тогда второй grep будетотобразить файлы .jsp.Обратите внимание, что -i говорит grep не заботиться о регистре букв, что может быть не тем, что вы хотите.

edit : следуя ответу Джона: мы должны уйти от .чтобы предотвратить его использование в качестве регулярного выражения.

re-edit : на самом деле, я думаю, что лучше использовать find, поскольку он напрямую фильтрует файлы jsp вместо поиска всех файлов:

find . -name "*.jsp" -exec grep -i "Logger\." {} \;

(-r вам больше не нужен, так как find заботится о рекурсии.

...