我需要以秒为单位(而不是几分钟或几天)获得所有用户的空闲时间,我该怎么做?此命令列出所有已连接用户的空闲时间:
w | awk '{if (NR!=1) {print $1,$5 }}'
Run Code Online (Sandbox Code Playgroud)
输出:
USER IDLE
root 4:29m
root 105days
root 2days
root 10:49m
root 7.00s
root 4:27m
Run Code Online (Sandbox Code Playgroud)
如何将天数和分钟数转换为秒数?
空闲时间并不比用户登录的 TTY 设备的最后访问时间复杂。因此,这样做的一个简单方法是获取人们登录的所有 TTY 的名称以及stat
他们:
who -s | awk '{ print $2 }' | (cd /dev && xargs stat -c '%n %U %X')
Run Code Online (Sandbox Code Playgroud)
在某些系统上,这会为登录会话(例如不在真实 tty 上的 X11 会话)发出错误。
如果您想要年龄而不是绝对时间,请对其进行后处理以从当前时间中减去它:
who -s | awk '{ print $2 }' | (cd /dev && xargs stat -c '%n %U %X') |
awk '{ print $1"\t"$2"\t"'"$(date +%s)"'-$3 }'
Run Code Online (Sandbox Code Playgroud)
或使用perl
的-A
运算符:
who -s | perl -lane 'print "$F[1]\t$F[0]\t" . 86400 * -A "/dev/$F[1]"'
Run Code Online (Sandbox Code Playgroud)
小智 1
这不是最优雅的代码,它可以缩短,但那是为了你的作业:-)
w |awk '{
if (NR!=1){
if($5 ~ /days/){
split($5,d,"days");
print $1,d[1]*86400" sec"
}
else if( $5 ~ /:|s/){
if ($5 ~/s/) { sub(/s/,"",$5); split($5,s,"."); print $1,s[1]" sec" }
else if ( $5 ~/m/) { split($5,m,":"); print $1,(m[1]*60+m[2])*60" sec" }
else { split($5,m,":"); print $1,m[1]*60+m[2]" sec" }
}
else { print $1,$5}
}}'
Run Code Online (Sandbox Code Playgroud)