Intereting Posts
простая команда «find» не работает Как включить историю команд ksh между сеансами Создание копии файла, который автоматически обновляется Сколько файлов равно 1 inode Как отключить IPv6 в встроенных встроенных настройках Верхний вид леса с фильтром, могу ли я включить всех детей? mount.cifs не соблюдает права доступа к файлам в Ubuntu 12.04.2 LTS Удаление файлов в Linux невосстанавливается Каковы эти процессы и почему я не могу их убить? concat pdf страницы после pdfcrop Как запустить перезагрузку в качестве обычного пользователя без необходимости вводить пароль? Как запретить последовательный прием во время последовательной записи для последовательной линии RS485 (полудуплексная) заменить конкретную строку в файле на ansible Назначить непрерывный поток переменной и обработать переменную Как отладить драйвер, не связанный с устройством в Linux?

Получение комбинированного подсчета всех вхождений строки в несколько каталогов?

У меня есть (надеюсь) интересная проблема, о которой я мог бы посоветовать. У меня есть система, которая по существу используется для хранения журналов. Он имеет структуру каталогов, такую ​​как:

YYYY/MM/DD/hostname/ 

Существует несколько имен хостов, и под каждым из них есть куча gzip почасовых журналов (доступ, ошибка и т. Д.).

Меня интересует общее количество заданной строки в журналах доступа, разбитых по дням и имени хоста. Каков наилучший способ сделать это? Возможно ли это с комбинацией find и grep, или это слишком сложно для этого, и вместо этого нужен сценарий?

 for d in */*/*/*; do printf '%s: ' "$d" zcat -- "$d/"*.gz | grep -Fc STRING done 

будет подсчитывать количество строк, содержащих STRING.

Замените grep -Fc STRING на grep -Fo STRING | wc -l grep -Fo STRING | wc -l (предположим, что GNU grep ) имеет количество вхождений.

Замените zcat на gzip -dc если ваш zcat не поддерживает файлы .gz .

С помощью zsh и GNU grep вы можете сократить его до:

 for d (*/*/*/*) zcat $d/*.gz | grep -FcH --label=$d STRING 

Если вы хотите сделать это без стандартного анализатора журналов, вы можете сделать это в «одной строке» оболочки из каталога, содержащего ваши YYYY dirs:

 for d in */*/*; do echo -n "$d : " find $d -name *.log | xargs grep -c STRING done