Определите соответствие строки / метки времени регулярному выражению в скрипте Bash - PullRequest
0 голосов
/ 21 марта 2019

Мне нужно прочитать файл в bash-скрипте и всегда подтверждать, что если временная метка в каждой строке действительна, прежде чем что-либо делать.Моя временная метка выглядит так:

Mar 15 14:20:48

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

(date -d ...)

Но это имеет тенденцию проходить, даже если дата выглядит следующим образом: Mar 15 14:2

Мне сказали использовать регулярное выражение, чтобы определить, как выглядит дата такЯ использовал это

if [["${LASTTS}" =~ ^[a-zA-Z]+ [0-3][0-9]+ [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$ ]]; then

Но продолжаю получать ошибку, говоря: line 38: [[Mar 15 14:20:48: command not found

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

Если ваш формат всегда совпадает с "15 марта 14:20:48", если он правильный, то он всегда должен совпадать с +'%b %d %T'. Если это так, вы можете проверить не только формат, но и содержимое с помощью date.

$: ts='Mar 15 14:20:48' # valid date/time in correct format
$: [[ "$ts" == "$( date +'%b %d %T' -d "$ts" )" ]] && echo ok || echo mismatch
ok
$: ts='Mar 15 14:2' # valid date/time in wrong format
$: [[ "$ts" == "$( date +'%b %d %T' -d "$ts" )" ]] && echo ok || echo mismatch
mismatch
$: ts='Feb 31 14:20:48' # invalid date/time in correct format
$: [[ "$ts" == "$( date +'%b %d %T' -d "$ts" )" ]] && echo ok || echo mismatch
date: invalid date ‘Feb 31 14:20:48’
mismatch
2 голосов
/ 21 марта 2019

Я полагаю, что может быть проще попросить date выполнить преобразование в ожидаемый формат и проверить, идентичны ли формат ввода-даты и формат вывода-даты.Если они идентичны, строка ввода-даты является допустимой строкой:

Если вы используете следующую команду, она преобразует строку в ваш действительный формат:

date -d "input-date" "+%b %d %T"
  • При невозможности ввода даты вернется пустая строка:
  • Недопустимая дата ввода вернет другую строку

Примеры "

input-date (d1) | output-date (d2)| d1 == d2 | input valid
----------------+-----------------+----------+-------------
Mar 15 14:02:15 | Mar 15 14:02:15 | yes      | yes
Mar 15 14:2     | Mar 15 14:02:00 | no       | no
Mar 32 14:02:15 |                 | no       | no
Mak 15 14:02:15 |                 | no       | no
Mar 15 24:02:15 |                 | no       | no

Итак, ваш тест будетвыглядит так:

d1="Mar 15 14:20:48"
d2=$(date -d "$d1" "+%b %d %T" 2> /dev/null)
if [[ "$d1" == "$d2" ]]; then
   echo "the dates are the same"
fi

Этот метод немного безопаснее, чем использование регулярного выражения, так как многие строки могут проходить регулярное выражение, но не являются допустимой датой. Простым примером будет "XYZ 39 29:59:12 "

В случае вопроса ОП, он будет читать:

if [[ "${LASTTS}" == $(date -d "${LASTTS}" "+%b %d %T" 2> /dev/null) ]]; then
...