Я работаю над древним 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 // * легко запомнить и сложно ввести неправильно ...