Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用sed piped with w命令向用户显示最大空闲时间_Linux_Bash_Unix_Awk_Gawk - Fatal编程技术网

Linux 使用sed piped with 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-

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-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]"'

您只考虑几分钟和几秒钟,输出可以是几天、几周、几个月甚至几年!我相信,当他得到一个这种格式的例子时,他可以补充说,但我没有一个可以用几天、几个月或几年来处理的例子。我发布的内容对任何人来说都很容易理解和扩展。你只考虑几分钟和几秒钟,输出可以是几天、几周、几个月甚至几年!我相信,当他得到一个这种格式的例子时,他可以补充说,但我没有一个可以用几天、几个月或几年来处理的例子。我发布的内容对任何人来说都很容易理解和扩展。