Bash: синтаксическая ошибка: ожидается операнд (токен ошибки "-")

Я пытаюсь просмотреть журнал для определенных сообщений за последний час. Журналы форматируются следующим образом:

[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» работает с преобразованием даты в эпоху, но я не уверен, куда идти с этой ошибкой.

Запуск bash -x yourscript позволит вам увидеть команды в том виде, в котором они выполняются, с реальными значениями переменных; это значительно упрощает определение того, что происходит, особенно здесь, когда мы не знаем, что содержит ваш line или какие значения log_date_str или log_date используются на практике.

Charles Duffy 18.01.2019 18:57

Тем не менее, я В самом деле не знаю, почему вы смешиваете арифметику и синтаксис расширенного теста таким образом. (( ( $(date +%s) - log_date ) <= 3600 )) && echo "$line" менее синтаксис.

Charles Duffy 18.01.2019 18:58

Более того, ваш код не вызывает указанную ошибку только с предоставленной вами строкой ввода; посмотрите, как он работает правильно (и выбирает ничего не печатать, но нет выдает любую ошибку) в ideone.com/e57xWm. Попробуйте следовать определению минимальный воспроизводимый пример в своих примерах кода, чтобы другие могли увидеть проблему, о которой вы спрашиваете, и проверить свои ответы.

Charles Duffy 18.01.2019 19:00

Похоже, что есть строка журнала, начинающаяся с ************ S вместо даты и времени. Вам нужно отфильтровать строки, которые не соответствуют ожидаемому формату.

Barmar 18.01.2019 19:08

Это похоже на проблему, Бармар, я изначально работал с кошкой, затем искал определенную ошибку, а затем пытался использовать awk. Мне даже не пришло в голову, что теперь я получаю весь журнал, используя этот метод.

wafflenator 18.01.2019 19:14

Чарльз, спасибо за отзыв! Я основывался на stackoverflow.com/questions/35880325/…

wafflenator 18.01.2019 19:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
660
1

Ответы 1

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

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)

Другие вопросы по теме