Вычесть два временных кода

В BSD netstat -p является протоколом, тогда как это программа в netstat из net-tools, версия BSD, похоже, не имеет эквивалента. мужчина почти всегда ваш друг в таких случаях.

BSD имеет sockstat , который дает вам то, что вы хотите, но его, похоже, нет в OS X, к которой у меня есть доступ.

Как уже упоминалось, lsof , вероятно, является наиболее кроссплатформенным способом получения желаемого результата. добавьте -n , чтобы номера портов не преобразовывались в имена и не вводили вас в заблуждение ndl-aas , где вы ожидаете 3128.

0
21.11.2018, 23:57
2 ответа

Dada una matriz arr3 que contiene datos de muestra:

declare -a arr3=([0]="00:00:22.180 --> 00:00:25.600"
                 [1]="00:00:24.070 --> 00:00:27.790")

Puede recorrer cada elemento de la matriz, eliminar la hora de inicio y la hora de finalización, convertirlos en fracciones de segundo, calcular la duración y luego convertir esa duración de nuevo al formato hh :mm :ss.sss para el comando ffmpeg.

# converts HH:MM:SS.sss to fractional seconds
codes2seconds() (
  local hh=${1%%:*}
  local rest=${1#*:}
  local mm=${rest%%:*}
  local ss=${rest#*:}
  printf "%s" $(bc <<< "$hh * 60 * 60 + $mm * 60 + $ss")
)

# converts fractional seconds to HH:MM:SS.sss
seconds2codes() (
  local seconds=$1
  local hh=$(bc <<< "scale=0; $seconds / 3600")
  local remainder=$(bc <<< "$seconds % 3600")
  local mm=$(bc <<< "scale=0; $remainder / 60")
  local ss=$(bc <<< "$remainder % 60")
  printf "%02d:%02d:%06.3f" "$hh" "$mm" "$ss"
)

subtracttimes() (
  local t1sec=$(codes2seconds "$1")
  local t2sec=$(codes2seconds "$2")
  printf "%s" $(bc <<< "$t2sec - $t1sec")
)

declare -a arr3=([0]="00:00:22.180 --> 00:00:25.600"
                 [1]="00:00:24.070 --> 00:00:27.790")

for range in "${arr3[@]}"
do
  duration=$(subtracttimes "${range%% -->*}" "${range##*--> }")
  printf "%s\n" "ffmpeg -i movie.mp4 -ss ${range%% -->*} -t $duration -async 1 cut.mp4"
done

La función codes2secondsespera entrada en formato HH :MM :SS.sss;elimina los diversos elementos mediante la expansión de parámetros y luego los pasa a bcpara la conversión en número total de segundos.

La función seconds2codesespera una fracción de segundos e invierte la conversión, lo que da como resultado una cadena HH :MM :SS.sss.

La función subtracttimesconvierte los dos parámetros en fracciones de segundo y luego pregunta a bccuál es la diferencia.

El bucle al final pasa por cada elemento de arr3; utiliza las funciones anteriores para calcular la duración (nuevamente usando la expansión de parámetros para recuperar los dos tiempos )y luego imprime una llamada de muestra ffmpegpara que coincida con su salida de muestra.

Resultados:

ffmpeg -i movie.mp4 -ss 00:00:22.180 -t 3.420 -async 1 cut.mp4
ffmpeg -i movie.mp4 -ss 00:00:24.070 -t 3.720 -async 1 cut.mp4
1
28.01.2020, 02:32

Bueno, para los códigos de tiempo datepor lo general aparece en mi mente. No es el guión más elegante, pero hace el trabajo...

Asumo por su pregunta que ya ha leído las horas de inicio y finalización en las respectivas matrices y utilizará starty endcomo estos valores aquí y lo hará paso a paso:

#!/bin/bash

start=00:00:22.180
end=00:00:24.070

#convert timestamps to epoch time in nano seconds
start_ns="$(date -u -d"$start" +%s%N)"
end_ns="$(date -u -d"$end" +%s%N)"

difference="$(($end_ns-$start_ns))"

#date does not read epoch time in nanoseconds, 
#so it must be converted by division vith 10^9 before display
#date_diff is accurate up to full seconds
#use UTC time (-u) to avoid problems with time zones

date_diff="$( date -u -d@$((difference/1000000000)) +%H:%M:%S )"

#take care of milliseconds as remainder of division by 10^9 and correction by 10^6
ms_diff="$(( $difference%1000000000/1000000 ))"

#combine output to create desired format

echo "$date_diff"."$ms_diff"

Resultado

bash script.sh
00:00:01.890

Todo en una línea

echo "$(date -u -d@"$(( ($(date -u -d"$end" +%s%N) - $(date -u -d"$start" +%s%N))/1000000000 ))" +%H:%M:%S)"."$(( ($(date -u -d"$end" +%s%N) - $(date -u -d"$start" +%s%N))%1000000000/1000000 ))"

Tenga en cuenta que no sé si el tiempo de nanosegundos en datees una característica estándar de POSIX.

1
28.01.2020, 02:32

Теги

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