Требуется руководство со скриптом bash для проверки файлов журнала в определенном каталоге на наличие определенной строки - PullRequest
0 голосов
/ 08 марта 2020

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

, поэтому журналы находятся в следующем каталоге.

/ actlogs / sbclogger_archive

Имена файлов журналов находятся в каталогах с номерами 01-31 внутри этого каталога, и все файлы упакованы в архив.

Внутри этих пронумерованных каталогов находятся Тонны файлов, но я хочу найти только sipd.logthenthedate.gz и sipmsg.logthenthedate.gz.

Так что мне нужно просмотреть все файлы в следующем каталоге. "/ actlogs / sbclogger_archive"

Имеет 31 каталог с пометкой "01-31"

Тогда в каждом 01-31 есть сотни файлов, которые я хочу посмотреть только "sipd" .logthenthedate.gz "и" sipmsg.logthenthedate.gz ".

Сценарий, который я использую, приведен ниже, пожалуйста, дайте мне знать, что я могу сделать, чтобы сделать эту работу.

#!/bin/bash

read -p "Enter a phone number: " text
read -p "Enter directory of log file's, Hint it should be /actlogs/sbclogger_archive: " directory

#arr=( $(find $directory -type f -exec grep -l "$text" {} \; | sort -r) )
#find $directory -type f -exec grep -qe "$text" {} \; -exec bash -c '

file=$(find $directory -type f -name 'sipd.log*' -exec grep -qe "$text" {} \; -exec bash -c 'select f; do echo $f; break; done' find-sh {} +;)

if [ -z "$file" ]; then
    echo "No matches found."
else
    echo "select tool:"
    tools=("nano" "less" "vim" "quit")
    select tool in "${tools[@]}"
    do
        case $tool in
            "quit")
                break
                ;;
            *)
                $tool $file
                break
                ;;
        esac
    done
fi

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Это даст вам список подходящих файлов:

find \( -name 'sipd.log[0-9]*.gz' -o -name 'sipmsg.log[0-9]*.gz' \) \
     -exec sh -c 'gunzip -c {}| grep -m1 -q 888333' \; -print

./18/sipd.log20200118.gz
./7/sipd.log20200107.gz

Примечание: -m1 заставляет grep остановиться после первого совпадения, так как в этом случае вам достаточно только имени файла, этого достаточно.

Если у вас есть zgrep, вы можете сократить его до:

find \( -name 'sipd.log[0-9]*.gz' -o -name 'sipmsg.log[0-9]*.gz' \) \
     -exec zgrep -l '888333' {} \;

./18/sipd.log20200118.gz
./7/sipd.log20200107.gz

Кроме того, некоторые из предлагаемых вами инструментов не поддерживают файлы gzip (nano и некоторые варианты less например). В этом случае вам может понадобиться распаковать файл и снова сжать его, когда закончите.

И, возможно, вы захотите рассмотреть al oop, если хотите "выйти". Подача списка файлов в инструмент не имеет смысла.

Примечание: AFAIK zgrep не работает рекурсивно:

ОПИСАНИЕ

Zgrep вызывает grep для сжатых или сжатых файлов. Эти параметры grep приведут к завершению работы zgrep с кодом ошибки: (- - [d rR zZ] | --di * | --ex c* | - в c* | --re c* | --nu *). Все остальные указанные параметры передаются непосредственно в grep. Если файл не указан, то стандартный ввод при необходимости распаковывается и подается в grep. В противном случае данные файлы при необходимости распаковываются и передаются в grep.

, поэтому zgrep -rl "$text" "$directory" или zgrep -rl --include 'simpd.log*.gz' "$test" {01..31} не будут работать, если только у вас нет специального zgrep

0 голосов
/ 09 марта 2020

Поскольку вы должны разархивировать перед использованием инструмента, я бы разделил проблему на два блока. Во-первых, я бы расширил нужные вам пути (ищите в <directory> для телефона <text>), а затем итерировал бы, чтобы применить инструмент (потому что некоторые инструменты, такие как vim или nano не могут быть переданы по трубопроводу). Попробуйте что-то вроде этого:

#!/bin/bash
#...
# text/directory input stuff
#...
tmpdir=$(mktemp -d)
trap 'rm -rf ${tmpdir}' EXIT

while IFS= read -r file; do
  unzipped=${tmpdir}/$(basename "${file}" .gz)
  gunzip -c "${file}" > "${unzipped}"
  ${tool} "${unzipped}"
done < <(zgrep -lw "${text}" "${directory}"/{01..31}/{sipd.logthenthedate.gz,sipmsg.logthenthedate.gz} 2>/dev/null)

Выше предложена Чарльз Даффи в инвертированной форме после этого Bash FAQ .

Если вы предпочитаете итерировать массив , вы могли бы построить таким образом:

# shellcheck disable=SC2207
files=( $(zgrep -lw "${text}" "${directory}"/{01..31}/{sipd.logthenthedate.gz,sipmsg.logthenthedate.gz} 2>/dev/null) )

for file in "${files[@]}"; do
# etc.

, поскольку в нашем конкретном случае сопоставляемые файлы не имеют пробелов в своих именах, и предупреждение о проверке оболочки не так важно (скрыто выше).

БЗ

...