# log.awk # # A script for gawk to (record|report) your task&time. # # to record the job just finished: # gawk -f log.awk LOGFILE TASKNAME # or # echo TASKNAME | gawk -f log.awk LOGFILE # to get a report: # gawk -f log.awk LOGFILE DATE # or # echo LOGFILE DATE | gawk -f log.awk LOGFILE # DATE: yyyy-mm-dd # today # yesterday # 0 # -1 # ... # yyyy-mm-dd yyy-mm-dd (beginning and ending) BEGIN { if (ARGC < 2) { print "usage: gawk -f log.awk LOGFILE" | "cat 1>&2"; exit} logfile = ARGV[1] if (ARGC < 3) { getline < "/dev/stdin" > 0 taskname = $0 close("/dev/stdin"); } else { taskname = ARGV[2] for (i = 3; i < ARGC; i++) { taskname = taskname " " ARGV[i] } ARGC = 2 } now=systime() sub("today", 0, taskname) sub("yesterday", -1, taskname) if (taskname ~ "days* *ago *$") { sub("days* *ago *", "", taskname); sub("^", "-", taskname); } if (taskname ~ /^-*[0-9]+ *$/) { taskname = strftime("%Y-%m-%d",taskname * 86400 + now) } if (taskname ~ /^ *[0-9]+-[0-9]+-[0-9]+/) { split(taskname,border," +") start=mktime(gensub("[-/:]"," ","g",border[1] " 0 0 0")) end=mktime(gensub("[-/:]"," ","g",border[2] " 0 0 0")) if (end < 0) { end = start} if (start < 0 || start > end) { print "Error: inconsistent time order" | "cat 1>&2" exit } end = end + 86400 } else { if (taskname ~ /^ *$/) { exit } print strftime("%Y/%m/%d-%H:%M:%S") " " taskname >> logfile exit } } { if ($1 ~ /^ *#|^ *$/) next gsub ("[-/:]"," ",$1) prev = point point = mktime($1) if (point < prev) { print "Error: Log file is not ascending order at: \"" $0 "\"" | "cat 1>&2" exit } if (prev < 0 || point <= start || prev >= end) { next } if (prev < start) { from = start } else { from = prev } if (point > end) { to = end } else { to = point } if ($2 in tasks) { tasks[$2] += to - from } else { tasks[$2] = to - from } } END { for (task in tasks) { sum=tasks[task] hour = int (sum / 3600) min = int (sum % 3600 / 60) printf ("%20s %3d:%2d\n", task, hour, min) } }