Я пытаюсь просмотреть журнал для определенных сообщений за последний час. Журналы форматируются следующим образом:
[1/18/19 9:59:13:791 CST] <Extra text here...>
У меня были проблемы с простым сравнением дат с awk, поэтому я подумал о преобразовании в эпоху и сравнении. Я беру поле 1 и отрезаю миллисекунды от поля 2 и удаляю [] (хотя я думаю, что мог бы просто сделать [ для своих целей).
while read -r line || [[ -n "$line" ]]
do
log_date_str = "$(awk '{gsub("\\[|\\]", "");print $1" "substr($2,1,length($2)-4)}' <<< "$line")"
log_date = "$(date -d "$log_date_str" +%s)"
[[ $(($(date +%s)-$log_date)) -le 3600 ]] && echo "$line"
done < /path/to/file
Однако, когда я пытаюсь запустить это с файлом журнала, я получаю эту ошибку:
date: invalid date `************ S'
-bash: 1547832909-: syntax error: operand expected (error token is "-")
Взяв одну дату, например. «18.01.19 9:59:13» работает с преобразованием даты в эпоху, но я не уверен, куда идти с этой ошибкой.
Тем не менее, я В самом деле не знаю, почему вы смешиваете арифметику и синтаксис расширенного теста таким образом. (( ( $(date +%s) - log_date ) <= 3600 )) && echo "$line" менее синтаксис.
Более того, ваш код не вызывает указанную ошибку только с предоставленной вами строкой ввода; посмотрите, как он работает правильно (и выбирает ничего не печатать, но нет выдает любую ошибку) в ideone.com/e57xWm. Попробуйте следовать определению минимальный воспроизводимый пример в своих примерах кода, чтобы другие могли увидеть проблему, о которой вы спрашиваете, и проверить свои ответы.
Похоже, что есть строка журнала, начинающаяся с ************ S вместо даты и времени. Вам нужно отфильтровать строки, которые не соответствуют ожидаемому формату.
Это похоже на проблему, Бармар, я изначально работал с кошкой, затем искал определенную ошибку, а затем пытался использовать awk. Мне даже не пришло в голову, что теперь я получаю весь журнал, используя этот метод.
Чарльз, спасибо за отзыв! Я основывался на stackoverflow.com/questions/35880325/…
См. также Как использовать Шеллчек, Как отлаживать bash-скрипт? (U&L.SE), Как отлаживать bash-скрипт? (SO), Как отлаживать bash-скрипт? (AskU), Отладка Bash-скриптов и т. д.





Как указывалось в комментариях, я получал данные, которые не были датой, поскольку анализировал весь журнал. Проверка входного файла для нужного мне текста решила мои проблемы, и я перешел к предложению Чарльза.
while read -r line || [[ -n "$line" ]]
do
log_date_str = "$(awk '{gsub("\\[|\\]", "");print $1" "substr($2,1,length($2)-4)}' <<< "$line")"
log_date = "$(date -d "$log_date_str" +%s)"
(( ( $(date +%s) - log_date ) <= 3600 )) && echo "$line"
done < <(grep ERROR_STRING /path/to/file.log)
Запуск
bash -x yourscriptпозволит вам увидеть команды в том виде, в котором они выполняются, с реальными значениями переменных; это значительно упрощает определение того, что происходит, особенно здесь, когда мы не знаем, что содержит вашlineили какие значенияlog_date_strилиlog_dateиспользуются на практике.