Назад | Перейти на главную страницу

Как воспроизвести параметр grep --recursive в старой версии grep

Я работаю над древним UNIX, чей grep отсутствует рекурсивный параметр -r / -.

Мне нужно найти ошибку, которую вызывает наше приложение, но я не знаю, в какой файл журнала наше приложение записывает ошибки. Однако я знаю, что файл журнала находится где-то в /opt. Итак, я хочу найти FooErrorMessage под /opt в *.log. Вот что я пробовал:

find /opt | xargs grep FooErrorMessage

- но это не работает, и я не знаю, где указать, что я просто хочу *.log файлы в команде.

Вы просто пытаетесь найти все файлы журналов в /opt и ищи их somethnig_I_am_looking_for право? Почему нет:

find /opt -name '*.log' | xargs grep something

или

find /opt | grep .log | xargs grep something

?

О, и поскольку я не могу понять, как прокомментировать другие ответы: будьте осторожны с * .log, поскольку оболочка будет интерпретировать это как globbing и сопоставить все файлы в текущем каталоге, которые заканчиваются на .log . Вы должны использовать \ *. Log или '* .log'

Остерегайтесь имен файлов с пробелами в них, поскольку это разрешено Unix; xargs подавится ими. Использовать find /opt -name '*.log' ... -print0 | xargs -0 grep ..., эти варианты предназначены для совместной работы.

Кроме того, grep или ваша оболочка могут иметь ограниченное количество аргументов, и список файлов, возвращаемых find, может превышать это количество. Использовать -n number опция xargs для запуска grep кусками число файлы.

у тебя есть perl?

пытаться -- http://betterthangrep.com/

find /opt -type f -name *.log -print | xargs grep 'something_I_am_looking_for'

Помимо добавления «-name '* .log'», попробуйте добавить -n1 в xargs.

Возможно, ваш древний grep не может принимать несколько входных файлов, поэтому -n1 будет запускать grep для каждого из этих файлов, вместо того, чтобы передавать их сразу в качестве аргументов

Вы также можете сделать это с помощью параметра exec для поиска вместо xargs

find / opt -exec grep "то, что вы ищете" {} \;

В GNU grep есть собственная опция «рекурсии»:

 grep -R foo /path/to/directory

Чтобы использовать grep для файлов определенного шаблона, лучше всего использовать find и xargs:

 find /path/to/directory -name \*.log -print0 | xargs -0 grep foo
find /opt -name *.log | xargs grep yourstring 

Если у вас нет подкаталогов с многоуровневой глубиной, grep *, grep / и grep // * легко запомнить и сложно ввести неправильно ...