Bash — Найти каталог, содержащий определенный файл журналов

#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}'