Ваша идея верна, но вы могли бы исправить несколько вещей, чтобы скрипт работал должным образом.
cat
в файле, сохранение в переменной и зацикливание — это в лучшем случае анти-паттерн -. При таком подходе строки будут разбиваться пробелами. Вместо этого используйте перенаправление файлов с помощью цикла while. grep
используйте встроенную поддержку регулярных выражений bash
для извлечения строки даты для преобразования EPOCH bash
не предоставляет возможности сравнения date
строк, вам необходимо преобразовать их в эквивалентные значения EPOCH и выполнить целочисленное сравнение Итак, собираем это вместе, без использования каких-либо сторонних инструментов и только с внутренними компонентами оболочки. Требуется команда date
из GNU utils для использования флага -d
и может не работать на родных машинах date
из *BSD.
#!/usr/bin/env bash
errorCodeFilePath="/home/.errorfile.log"
re='[0-9]+/[0-9]+/[0-9]+:[0-9]+\.[0-9]+\.[0-9]+'
convDateString() {
day="${1##*:}"
time="${1%%:*}"
printf '%d' "$(date -d"$time ${day//./:}" +%s)"
}
while IFS= read -r line; do
inputArg="$1"
inputEPOCH="$(convDateString "${inputArg}")"
if [[ $line =~ $re ]]; then
lineEPOCH="$(convDateString "${BASH_REMATCH[*]}")"
if [ "$lineEPOCH" -gt "$inputEPOCH" ]; then
echo "${BASH_REMATCH[@]}" is greater
fi
fi
done<"$errorCodeFilePath"
Тестирование вашего файла на рассматриваемом образце ввода как
$ bash script.sh "2018/07/16:12.36.00"
2018/07/16:12.36.02 is greater
2018/07/16:12.36.15 is greater
После всего сказанного вам следует подумать о прочтении Почему использование цикла оболочки для обработки текста считается плохой практикой? . Потому что обработка текста в оболочке медленная по сравнению с другими инструментами, предназначенными для специальной обработки файлов.
Изменение режима связывания на балансировку нагрузки -«устранило» проблему.