Во-первых, проще всего это сделать с помощью других инструментов, например. cut -d: -f2 20180213.tmp
, awk -F: '{print $2}' 20180213.tmp
.
Однако я также хотел объяснить, почему ваш grep
метод не работает. Это потому, что он соответствует всем строкам после :
. Чтобы исправить это, вы можете сопоставить первое :
в регулярном выражении только с первым в обработанной строке, добавив перед ним ^[^\:]*
. Таким образом, любой символ перед исходным регулярным выражением не может быть :
. Полная команда:
grep -oP '^[^\:]*\:\K[^\:]+' 20180213.tmp
Также обратите внимание, что вам не нужно экранировать :
в регулярном выражении, поэтому вы можете упростить его с помощью:
grep -oP '^[^:]*:\K[^:]+' 20180213.tmp
Должно работать (, но не проверено )на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
).
Возможно, это не то, что вы имели в виду, но это намного проще с правильным язык программирования. Например, с 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