You almost had it, only substr or gsub functions with awk
$ uptime | awk '{print substr($3,1,length($3)-1)}' 2:49 $ uptime | awk '{sub(/,/,"");print $3}' 2:49
There is no need for excess piping or improper use of the back protrusions.
An even more reliable solution is better, given the uptime excellent output using (GNU) grep -Po "\d{1,2}:\d{2}(?=,)" :
# More than one day $ uptime 12:46:18 up 92 days, 5:00, 2 users, load average: 0.00, 0.01, 0.05 $ uptime | grep -Po "\d{1,2}:\d{2}(?=,)" 5:00 # Less than one day $ uptime 12:47:30 up 4:24, 7 users, load average: 0.34, 0.12, 0.07 $ uptime | grep -Po "\d{1,2}:\d{2}(?=,)" 4:24
Or using sed -rn 's/.*([0-9]{1,2}:[0-9]{2}),.*/\1/p :
# More than one day $ uptime 12:54:00 up 92 days, 5:07, 2 users, load average: 0.03, 0.02, 0.05 $ uptime | sed -rn 's/.*([0-9]{1,2}:[0-9]{2}),.*/\1/p' 5:07
UPDATE: So if uptime less than an hour, if another time !?
$ uptime 14:46:03 up 3 min, 4 users, load average: 0.54, 0.75, 0.36 $ uptime 14:53:40 up 11 min, 4 users, load average: 0.48, 0.62, 0.46
One regexp to manage all of them:
$ sed -rn 's/.*up\s+(.*),\s+[0-9]+ users.*/\1/p' file 92 days, 5:00 4:24 11 min 3 min
I guess this also applies to years!