#linux #bash
Вопрос:
Я создал скрипт для быстрого анализа некоторых журналов и автоматического предоставления советов по решению проблем на основе найденных ошибок. Все работает, как и ожидалось.
Однако, похоже, что структура папок, содержащих эти журналы, может измениться (зависит от конфигурации системы), и мой скрипт больше не работает.
Я хотел бы найти способ найти каталог, содержащий конкретные файлы, такие как журналы или appinfo.txt файл.
Как только я получу его, я смогу использовать его как переменную и, наконец, решить свою проблему.
Вот пример:
AppLogDirectory ='Your_Special_Command_You_Will_HelpMe_To_Find'
grep -i "Error" $AppLogDirectory/esl*.log
- Формат журнала: ESL.randomValue.log
- Проанализированные файлы : appinfo.txt, system.txt и т.д..
Как предлагается в разделе комментариев, я редактирую свой первоначальный пост более подробно, чтобы прояснить контекст, ниже приведен пример:
Log files (esl.xxx.tt.ss.log ) can be in random directory, like:
/var/log/ApplicationName/logs/
/opt/ApplicationName/logs/
/var/data/ApplicationName/Extended/logs/
Из-за случайного каталога мне нужно найти решение для печати имен каталогов файлов, которые соответствуют шаблону esl*.log (без имени файла esl)
Комментарии:
1. Ты имеешь в виду, как
find . -name "esl.*.log"
? При этом будут найдены файлы, а не родительский каталог.2.
find
Команда, вероятно, является хорошей отправной точкой:find . -type f ( -name 'esl*.log' -o -name appinfo.txt -o -name system.txt )
. Это позволит найти все файлы, которые вы упомянули (любойesl*.log
файл плюс два.txt
файла). И если вы добавите-exec grep "Error" {} ;
, он даже обработает их для вас.3. Другой вариант состоит в использовании только
grep
с его--recursive
и--include
опциями:grep --recursive --include 'esl*.log' --include appinfo.txt --include system.txt Error
. Или установитьack
и использовать его.4. Спасибо вам обоим за ваш быстрый ответ и за это хорошее начало, вывод, похоже, отвечает многим моим потребностям. Однако моя цель-найти каталог, содержащий эти файлы. Для упрощения команда должна ответить на следующий вопрос : В каком каталоге находятся файлы esl*.log
Ответ №1:
Используйте find
и передайте выходные данные xargs
в with grep
, например, который работает grep
с несколькими файлами и печатает выходные данные вместе с именем файла, в котором был найден шаблон:
find /path/to/files /another/path/to/other/files ( -name 'appinfo.txt' -o -name 'system.txt' -o -name 'esl*.log' ) -print0 | xargs -0 grep -i 'Error'
Или просто используйте -exec ...
, что дает тот же эффект, без необходимости xargs
:
find /path/to/files /another/path/to/other/files ( -name 'appinfo.txt' -o -name 'system.txt' -o -name 'esl*.log' -exec grep -i 'Error'
Чтобы найти каталоги, содержащие файлы, содержащие нужный шаблон, используйте grep -l
для печати только имена файлов (не совпадающие строки) и передайте результаты для xargs dirname
печати имен каталогов. Если вам нужны уникальные имена режиссеров, отправьте их дальше по sort -u
:
find /path/to/files /another/path/to/other/files ( -name 'appinfo.txt' -o -name 'system.txt' -o -name 'esl*.log' -exec grep -il 'Error' | xargs dirname | sort -u
смотрите также:
ГНУ find
инструкция
Для поиска файлов на основе их содержимого
xargs
Комментарии:
1. у find есть опция-exec: Просто
find /path/to/files /another/path/to/other/files ( -name 'appinfo.txt' -o -name 'system.txt' -o -name 'esl*.log' ) -exec grep -Hi error {} ;
2. @hek2mgl Спасибо тебе! Однако приведенный вами пример не печатает имена файлов, что может быть полезно многим пользователям.
3. @hek2mgl Спасибо, я изменил ответ , чтобы включить использование
find
with-exec ...
, что проще.4. @hek2mgl Он работает на mac. По крайней мере, с версией BSD по умолчанию 2010
grep
, которая поставляется с macOS. Но вы правы, если мы будем искать, мы должны найти версию grep, которая не поддерживает это.5. Спасибо всем за ваши ответы, однако, просто для уточнения. моя цель — найти путь, по которому локализован файл (без имени файла)-например, /var/opt/приложение/журналы/ (эта папка содержит esl.xxx-гггг-сссс-iii.log)
Ответ №2:
Решение найдено благодаря вам, еще раз спасибо!
#Ask for extracted tar.gz folder
read -p "Where did you extract the tar.gz file? r1
#directory path where esl files is located
logpath=`find $r1 -name "esl*.log" | xargs dirname | sort -u`
#Search value (here "Error") into all esl*.log
grep 'Error' $logpath/esl*.log | awk '{print $8}'