извлечь день месяца и час заданного сценария оболочки формата даты

Во-первых, проще всего это сделать с помощью других инструментов, например. cut -d: -f2 20180213.tmp, awk -F: '{print $2}' 20180213.tmp.

Однако я также хотел объяснить, почему ваш grepметод не работает. Это потому, что он соответствует всем строкам после :. Чтобы исправить это, вы можете сопоставить первое :в регулярном выражении только с первым в обработанной строке, добавив перед ним ^[^\:]*. Таким образом, любой символ перед исходным регулярным выражением не может быть :. Полная команда:

grep -oP '^[^\:]*\:\K[^\:]+' 20180213.tmp

Также обратите внимание, что вам не нужно экранировать :в регулярном выражении, поэтому вы можете упростить его с помощью:

grep -oP '^[^:]*:\K[^:]+' 20180213.tmp
0
26.02.2020, 00:48
2 ответа

Должно работать (, но не проверено )наksh:

echo "$MM_START", "$MM_END", $(( ($(date -d"${MM_END:0:8} ${MM_END:8}" +%s) - $(date -d"${MM_START:0:8} ${MM_START:8}" +%s) )/ 60 ))
202002261015, 202002261530, 315

Здесь используется оболочка

  • «арифметическое расширение» $((...))для выполнения разности и деления

  • «подстановка команды»$(...)(дважды, для двух dateкоманд ), которые «позволяют выводить команду вместо имени команды» (ср.man bash)

  • «Расширение параметра / Расширение подстроки» для извлечения подстрок из переменной.

В конце концов, он производит две «секунды эпохи», которые вычитаются, и результат делится на 60, чтобы получить минуты. Имейте в виду, что bashвыполняет только целочисленную арифметику (не может говорить заksh).

0
28.04.2021, 23:22

Возможно, это не то, что вы имели в виду, но это намного проще с правильным язык программирования. Например, с PHP:

<?php
$o1 = date_create('202002261015');
$o2 = date_create('202002261530');
$o3 = date_diff($o2, $o1);
echo 'days: ', $o3->d, ', hours: ', $o3->h, "\n";

Результат:

days: 0, hours: 5

https://php.net/function.date-diff

0
28.04.2021, 23:22

Теги

Похожие вопросы