Linux 使用sed piped with w命令向用户显示最大空闲时间
w命令生成如下内容:Linux 使用sed piped with w命令向用户显示最大空闲时间,linux,bash,unix,awk,gawk,Linux,Bash,Unix,Awk,Gawk,w命令生成如下内容: 01:19:02 up 53 days, 10:44, 15 users, load average: 0.00, 0.02, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT higrheht pts/5 c-13-76-207-161. 23:21 2:05 0.07s 0.07s -bash sgergrgr pts/6 c-97-164-31-
01:19:02 up 53 days, 10:44, 15 users, load average: 0.00, 0.02, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
higrheht pts/5 c-13-76-207-161. 23:21 2:05 0.07s 0.07s -bash
sgergrgr pts/6 c-97-164-31-14.h 00:54 2.00s 0.04s 0.04s -bash
jwegrgrng pts/14 c-23-71-12-251.h 22:48 8:03 0.07s 0.06s vim s2
hiqrefan pts/18 c-13-31-206-169. 23:19 0.00s 0.01s 0.01s -bash
hqeffran pts/19 c-19-71-206-169. 23:19 1:58m 0.02s 0.02s -bash
aqrgri pts/20 c-84-6-212-27.hs 23:21 0.00s 0.19s 0.17s -bash
我必须得到一个sed脚本,它可以打印空闲时间最长的用户。但问题是w以3种不同的格式显示空闲时间:1)以秒为单位:以“s”结尾;2)mm:ss(不以“m”或“s”结尾);3)hh:mm(以“m”结尾)。因此,我需要以某种方式制作一个sed脚本,它可以与之一起工作,而我似乎无法做到这一点
我的尝试:
首先设置两个变量,以确定最高空闲时间是在表1、表2还是表3中。那部分已经完成了。然后基于此,我将提取空闲字段中的文本,并将其与变量进行比较,如果时间较长,则替换。但它的结尾有一封信!所以它不能作为一个数字来比较。它是一根绳子。这就是问题所在
BEGIN{view1=0
view3=0
userid=""
idlemax=""}
NR>2{
if($5 ~ /s$/)
{
view2=1
}
if($5 ~ /m$/)
{
view3= 1
}
}
您可以使用bash而不是sed:
#!/bin/bash
decode_seconds()
{
echo "${1%%.*}"
}
decode_hrs()
{
echo $(( $( decode_pair "${1}") * 60 ))
}
decode_pair()
{
local value="${1}"
local right="${value##*:}"
local left="${value%%:*}"
echo $(( (left * 60 ) + right ))
}
decode_value()
{
local value="${1}"
local units="${2}"
case "${units}" in
seconds) decode_seconds "${value}" ;;
hours) decode_hrs "${value}" ;;
*) decode_pair "${value}" ;;
esac
}
process_data()
{
while read user value units extra ; do
echo $(decode_value "${value}" "${units}") "${user}"
done
}
w | awk '{print $1,$5}' \
| sed \
-e 's/s$/ seconds/' \
-e 's/m$/ hours/' \
| process_data \
| sort -rn
您可以使用bash而不是sed:
#!/bin/bash
decode_seconds()
{
echo "${1%%.*}"
}
decode_hrs()
{
echo $(( $( decode_pair "${1}") * 60 ))
}
decode_pair()
{
local value="${1}"
local right="${value##*:}"
local left="${value%%:*}"
echo $(( (left * 60 ) + right ))
}
decode_value()
{
local value="${1}"
local units="${2}"
case "${units}" in
seconds) decode_seconds "${value}" ;;
hours) decode_hrs "${value}" ;;
*) decode_pair "${value}" ;;
esac
}
process_data()
{
while read user value units extra ; do
echo $(decode_value "${value}" "${units}") "${user}"
done
}
w | awk '{print $1,$5}' \
| sed \
-e 's/s$/ seconds/' \
-e 's/m$/ hours/' \
| process_data \
| sort -rn
空闲时间并不比用户登录的TTY设备的上次访问时间复杂。因此,一种简单的方法是获取所有TTY用户登录的姓名,然后
stat
who -s | awk '{ print $2 }' | (cd /dev && xargs stat -c '%n %U %X')
在某些系统上,这将为登录会话(如X11会话)发出错误,这些会话不在真正的TTY上
如果要使用年龄而不是绝对时间,请对其进行后期处理以从当前时间中减去:
who -s | awk '{ print $2 }' | (cd /dev && xargs stat -c '%n %U %X') |
awk '{ print $1"\t"$2"\t"'"$(date +%s)"'-$3 }'
或者使用perl
的-A
操作符:
who -s | perl -lane 'print "$F[1]\t$F[0]\t" . 86400 * -A "/dev/$F[1]"'
从中,空闲时间并不比用户登录的TTY设备的上次访问时间复杂。因此,一种简单的方法是获取所有TTY用户登录的姓名,然后
stat
who -s | awk '{ print $2 }' | (cd /dev && xargs stat -c '%n %U %X')
在某些系统上,这将为登录会话(如X11会话)发出错误,这些会话不在真正的TTY上
如果要使用年龄而不是绝对时间,请对其进行后期处理以从当前时间中减去:
who -s | awk '{ print $2 }' | (cd /dev && xargs stat -c '%n %U %X') |
awk '{ print $1"\t"$2"\t"'"$(date +%s)"'-$3 }'
或者使用perl
的-A
操作符:
who -s | perl -lane 'print "$F[1]\t$F[0]\t" . 86400 * -A "/dev/$F[1]"'
从您只考虑几分钟和几秒钟,输出可以是几天、几周、几个月甚至几年!我相信,当他得到一个这种格式的例子时,他可以补充说,但我没有一个可以用几天、几个月或几年来处理的例子。我发布的内容对任何人来说都很容易理解和扩展。你只考虑几分钟和几秒钟,输出可以是几天、几周、几个月甚至几年!我相信,当他得到一个这种格式的例子时,他可以补充说,但我没有一个可以用几天、几个月或几年来处理的例子。我发布的内容对任何人来说都很容易理解和扩展。