#!/usr/bin/env awk -f function log10(n) { return log(n)/log(10.0) } function merge_meas(est_val, est_unc, meas_val, meas_unc) { # Kalman filtering compares variances, # convert uncertainties to square units est_unc = (0.5*est_unc)^2.0 meas_unc = (0.5*meas_unc)^2.0 K = (est_unc)/((est_unc) + (meas_unc)) est_val = est_val + K*(meas_val - est_val) est_unc = (est_unc*meas_unc)/(est_unc + meas_unc) # convert est_unc back to original units est_unc = 2.0*sqrt(est_unc) return sprintf(OFMT OFS OFMT ORS, est_val, est_unc) } function sigfig(val, unc) { ordmag_val = log10(val) ordmag_unc = log10(unc) ordmag_high = sqrt((ordmag_val)^2.0 + (ordmag_unc)^2.0) ordmag_low = ((ordmag_val)^-1.0 + (ordmag_unc)^-1.0)^-1.0 ordmag_range = ordmag_high - ordmag_low sigfig_unc = sprintf("%.f", sqrt((ordmag_range)^2.0 + 3.0^2.0)) sigfig_val = sprintf("%.f", sqrt((ordmag_range)^2.0 + (sigfig_unc)^2.0 + 3.0^2.0)) ofmt_val = "%." sigfig_val "g" ofmt_unc = "%." sigfig_unc "g" return sprintf(ofmt_val OFS ofmt_unc, val, unc) } function ck_cptime() { t_sys_meas[1] = systime() t_sys_meas[2] = 1.0 "sysctl kern.cp_time" | getline cptime_cmd close("sysctl kern.cp_time") split(merge_meas(t_sys_meas[1], t_sys_meas[2], systime(), 1.0), t_sys_meas) sub("^.*=", "", cptime_cmd) gsub(",", OFS, cptime_cmd) #split(cptime_cmd, cptime_arr, ",") return sprintf(OFMT OFS "%s", t_sys_meas[1], cptime_cmd) } function ck_uptime() { # check uptime cmd "uptime" | getline t_up_cmd close("uptime") # evaluate measured uptime t_up_meas[1] = 0.0 t_up_meas[2] = systime() sub("^.*up ", "", t_up_cmd) sub(", load.*$", "", t_up_cmd) split(t_up_cmd, t_up_cmd_arr, ",") for (i in t_up_cmd_arr) { # TODO: add cases for days, months, years, etc. if (t_up_cmd_arr[i] ~ /day/) { split(t_up_cmd_arr[i], days) t_up_meas[1] += 86400.0*(days[1] + 0.0) (t_up_meas[2] > 86400.0) ? t_up_meas[2] = 86400.0 : t_up_meas[2] += 0.0 } if (t_up_cmd_arr[i] ~ /hr/) { split(t_up_cmd_arr[i], hrs) t_up_meas[1] += 3600.0*(hrs[1] + 0.0) (t_up_meas[2] > 3600.0) ? t_up_meas[2] = 3600.0 : t_up_meas[2] += 0.0 } if (t_up_cmd_arr[i] ~ /min/) { split(t_up_cmd_arr[i], mins) t_up_meas[1] += (60.0*(mins[1] + 0.0)) (t_up_meas[2] > 60.0) ? t_up_meas[2] = 60.0 : t_up_meas[2] += 0.0 } if (t_up_cmd_arr[i] ~ /:/) { split(t_up_cmd_arr[i], hrs_min, ":") t_up_meas[1] += 3600.0*(hrs_min[1] + 0.0) (t_up_meas[2] > 3600.0) ? t_up_meas[2] = 3600.0 : t_up_meas[2] += 0.0 t_up_meas[1] += 60.0*(hrs_min[2] + 0.0) (t_up_meas[2] > 60.0) ? t_up_meas[2] = 60.0 : t_up_meas[2] += 0.0 } } return sigfig(t_up_meas[1], t_up_meas[2]) } BEGIN { OFMT="%f" pi = 4.0*atan2(1.0, 1.0) c0 = 299792458 # m/sec #print("_systime_", systime()) #print("_boottime_", ck_boottime()) print( ck_cptime() ) }