Сценарий оболочки для grep в диапазоне файлов - PullRequest
1 голос
/ 28 июня 2019

Я устанавливаю скрипт, который принимает некоторые пользовательские данные с помощью команды read.Используя эти данные, мне нужно найти диапазон файлов, а затем выполнить некоторую фильтрацию.Вот как это,

Enter fromtime

read fromtime

Enter totime

read totime

Enter the ID

read id

Сначала я SSH на сервер, а затем там у меня есть каталог, Записи с путем cd home/report/records здесь, у меня есть:

  • REC_201901020345.gz (ггггммдччмм)
  • REC_201901120405.gz
  • REC_201903142543.gz

и так далее.

Эти файлы содержат данные вместе с $id.

Когда пользователь вводит $fromtime и $totime, он будет иметь формат ггггммддч.Здесь мне нужно перейти к этому диапазону файлов, а затем grep для $id и отображения.Например:

Если $fromtime равно 2019010103 и $totime равно 2019031425.Мне нужно перейти только к определенному диапазону файлов, который является REC_201901020345.gz, REC_201901120405.gz, REC_201903142543.gz и выполнить grep, чтобы найти id, введенный пользователем.

Я пыталсяэто использует условие if, но, похоже, оно не работает.Я новичок в написании таких сценариев.Могут быть ошибки, когда я все здесь описал.Извините за то же самое.

source config.sh

Enter fromtime

read fromtime

Enter totime

read totime

Enter the ID

read id

ssh $user@$ip


cd /home/report/records

# <-- need to know what to add here as described here, to navigate to the
# <-- specific range $fromtime-$totime. Then the command to find id will be 

zfgrep $id *.gz

Результатом должны быть только данные с id в указанном диапазоне .gz файлов.

Ответы [ 2 ]

3 голосов
/ 28 июня 2019

Попробуйте команду ниже.

echo -e "$(ls -1 REC_????????????.gz 2>/dev/null)\nREC_${fromtime}##\nREC_${totime}##" | sort | sed -n "/##/,/##/p" | sed '1d;$d' | xargs zfgrep -a "$id"  

Пояснение:
'fromdate' и 'todate' вместе с ## (скажем, маркером) добавляются к выводу ls.
Сортировка ввода, в результате чего нужные имена файлов заключены в маркер.
Обе sed, печатает только строки между маркером.
Последняя - это команда, которая должна выполняться для каждого имени файла.

Вы можете опустить каналы и все последующие команды, начиная с конца, и посмотреть, как строится вывод.

0 голосов
/ 28 июня 2019

Чтобы получить список файлов в заданном диапазоне (от времени, до времени), можно использовать следующий сценарий оболочки:

declare -i ta
for file in REC*.gz
do 
    ta=$(echo "${file}" | grep -oP 'REC_\K(.*)(?=[[:digit:]]{2}.gz)')
    if [ "${ta}" ] ; then  
       if [ ${ta} -le ${totime} -a ${ta} -ge ${fromtime} ] ; then 
          echo -e "${file}"
       fi
    fi  
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...