last命令不直接计算总在线时长,需结合awk、date等工具解析登录/登出时间戳并累加;对“still logged in”会话用当前时间作结束点,支持自动换算为时分秒格式。

last 命令本身不直接计算总在线时长,它只列出登录/登出记录(含时间戳),但可以通过组合 awk、grep、date 等工具提取并计算特定用户的每次会话时长,再累加得出总时长。
确认 last 输出格式与字段含义
运行 last -n 20 username 查看目标用户的最近登录记录。关键字段顺序通常为:
- 用户名(第1列)
- 终端(tty/pts,第2列)
- 主机名或IP(第3列,若从远程登录)
- 登录时间(第4–7列,如 Oct 12 09:30)
- 登出时间或 still logged in(第9–10列)
注意:只有成功登出的会话才有明确结束时间;“still logged in” 表示当前仍在线,需用当前时间作为结束点。
提取该用户所有完整会话的起止时间
用 last -F username(-F 显示完整日期时间,推荐)输出,再用 awk 处理:
- 过滤出有明确登出时间的行(不含 "still logged in" 和 "gone - no logout")
- 对 "still logged in" 行,把登出时间设为当前系统时间(
$(date "+%a %b %d %H:%M:%S %Y")) - 将起止时间转为 Unix 时间戳(秒数),相减得单次会话秒数
一键统计总时长(支持 still logged in)
复制粘贴执行以下命令(替换 username 为实际用户名):
last -F username | \
awk '{
if (NF /dev/null"
cmd1 | getline t1; close(cmd1)
cmd2 = "date -d \"" logout_str "\" +%s 2>/dev/null"
cmd2 | getline t2; close(cmd2)
if (t1 != "" && t2 != "" && t2 > t1) {
total += (t2 - t1)
}
} END {
if (total > 0) {
printf "%dh %dm %ds\n", int(total/3600), int((total%3600)/60), total%60
} else {
print "No valid sessions found"
}
}'
注意事项
- 需要 root 权限才能读取完整 /var/log/wtmp(尤其是跨重启的记录),普通用户可能只能看到近期部分记录
- 系统时间必须准确,否则时间戳计算会偏差
- 如果 last 输出中时间格式因 locale 不同(如中文系统显示“十月”),需先设置
LANG=C last -F username保证英文月份缩写 - 长时间未清理的 wtmp 可能包含大量历史数据,影响速度,可加
-n 1000限制条数











