csh для получения разницы между временем начала и окончания обоих входов в формате чч:мм:сс

Определение структуры показывает, что h_protoявляется 16-битным -битным целым числом -с прямым порядком байтов -:

struct ethhdr {
        unsigned char   h_dest[ETH_ALEN];       /* destination eth addr */
        unsigned char   h_source[ETH_ALEN];     /* source ether addr    */
        __be16          h_proto;                /* packet type ID field */
} __attribute__((packed));

Так что вам нужно обработать его с помощью ntohsперед чтением. Как только вы это сделаете, вы увидите правильное значение 0x0800.

1
22.03.2020, 08:24
2 ответа

Для полной разницы:

perl -e 'for(@ARGV){s/(..):(..):(..)/$1*3600+$2*60+$3/e} $_=(shift)-(shift); printf"%02d:%02d:%02d\n",$_/3600,$_/60%60,$_%60' 05:25:00 02:30:50

Для разницы в минутах:

perl -e 'for(@ARGV){s/(..):(..):(..)/$1*3600+$2*60+$3/e} $_=(shift)-(shift); printf"%d\n",$_/60' 05:25:00 02:30:50

Работает и в bash.

0
28.04.2021, 23:19

Неясно, хотите ли вы, чтобы две даты переносились на дни, или вы предполагаете, что они обе относятся к одному и тому же дню и могут располагаться в любом порядке.

Этот ответ предполагает первый, то есть timediff 23:00:00 01:00:00должен вернуть 2 часа = 120 минут.

Измените @ s = 86400 + $sна @ s = - $s, если это должно вернуть 22 часа = 79200 минут.

alias timediff 'set t=(\!:*:gs/:/ * 3600 + /:gs/:/ * 60 + /:q);\\
   @ s = ($t[2]) - ($t[1]); if($s < 0) @ s = 86400 + $s;\\
   @ m = $s / 60;\\
   @ H = $s / 3600 M = $s % 3600 / 60 S = $s % 60;\\
   echo seconds=$s minutes=$m hours=$H\:$M\:$S'

timediff 05:25:00 02:30:50
seconds=75950 minutes=1265 hours=21:5:50

Как сценарий:

set t=($argv:gs/:/ * 3600 + /:gs/:/ * 60 + /:q)
@ s = ($t[2]) - ($t[1]); if($s < 0) @ s = 86400 + $s
@ m = $s / 60
@ H = $s / 3600 M = $s % 3600 / 60 S = $s % 60
echo seconds=$s minutes=$m hours=$H\:$M\:$S
1
28.04.2021, 23:19

Теги

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