【问题标题】:Showing only the uptime from uptime [unix]仅显示正常运行时间 [unix] 的正常运行时间
【发布时间】:2009-11-15 20:13:06
【问题描述】:

我想调整正常运行时间的输出

20:10  up 23 days,  3:28, 3 users, load averages: 3.84 1.06 0.64

所以它只是显示:

23 days

我尝试过使用 sed,但我不确定它是否适合这项工作,也没有太多使用它的经验。

我怎样才能达到我想要的输出?

【问题讨论】:

    标签: regex sed uptime


    【解决方案1】:

    考虑使用cut

      uptime | tr "," " " | cut -f6-8 -d" "
    

    似乎可以在我的 MacBook 上使用。在这里,我还使用了tr 来杀死无关的“,”。短期和长期正常运行时间的不同格式存在一些问题。


    一个可能的 sed 解决方案:

    uptime | sed 's/.*up \([^,]*\), .*/\1/'
    

    它不依赖于出现在uptime 的输出中的字符串“days”。

    【讨论】:

    • 投反对票的不是我吗...两者似乎都合乎逻辑-也许他们只是心情不好!
    • 会发生被投票反对的情况。我只是想知道我的解决方案是否有问题。
    • 在 Arch Linux 上不适合我。抱歉,我在投票后忘记发表评论了。
    • @icco:有了更多信息,我或许可以修复它,但是“标准”实用程序输出的血腥细节可能因 unix 而异,因此这种管道有时需要调整...
    【解决方案2】:
    uptime | sed -E 's/^.+([0-9]+ days).+$/\1/'
    

    【讨论】:

    • \1 表示第一个捕获的组(在括号中)。
    • 请注意,当子字符串 days 不存在时(在不到一天前重新启动时),此解决方案将不起作用。
    【解决方案3】:

    你可以直接使用shell而不需要任何外部工具

    $ var="20:10  up 23 days,  3:28, 3 users, load averages: 3.84 1.06 0.64"
    $ var=${var/#*up}
    $ echo ${var%%,*}
    23 days
    

    【讨论】:

    • 这很聪明 - 不知道你能做到这一点!
    • 不错。理论上我知道,但我从不记得使用 bash 扩展。 (可能值得注意的是,这不适用于所有外壳......)
    • 原来的bourne shell,csh,不知道ksh...所有的unix都不运行bash。
    【解决方案4】:

    上述解决方案仅显示天数或小时数。我意识到这就是 OP 正在寻找的东西,但我也在寻找包括小时和分钟在内的内容。这会显示系统开启超过一天的天数和小时/分钟,或者仅显示系统开启不到一天的小时数:

    uptime | sed 's/^.* up \+\(.\+\), \+[0-9] user.*$/\1/'
    

    向黑带正则表达式忍者 Zach W 提供支持以使其正常工作。

    【讨论】:

    • 对于单个用户,uptime 输出为“1 个用户”,因此与上面的“用户”(复数)不匹配。将其更改为“用户”,它似乎可以工作。
    • 要匹配userusers,您可以将正则表达式的结尾更改为...users?.*$。但是,正如@PeterGibson 建议的那样,.*$ 匹配到行尾的所有内容,只是省略了s,给...user.*$ 应该可以工作。
    【解决方案5】:

    我认为这是最简单的解决方案:

    uptime | awk '{print $3}'
    

    正常运行时间 | awk '{打印 $3}'

    10

    【讨论】:

      【解决方案6】:
      uptime=$(</proc/uptime) ;  uptime=${uptime%%.*} ; days=$(( uptime/60/60/24 )); echo $days days
      

      【讨论】:

      • 这是唯一首先使用 /proc/uptime 来获得一致数据格式的解决方案。
      【解决方案7】:

      uptime 的输出通常有“x days, y min”或“x days, y:z” - 但有时如果正常运行时间少于一天,它有几个小时/minutes 作为第一个基于时间的输出,并且不关心天数。输出的其余部分在列数方面非常一致。因此,我个人一直使用 sed 来删除最后四列:

      $ uptime | sed -e 's/^ [^ ]* up \(.*\)\(,[^,]*\)\{4\}$/\1/'
      31 days, 35 min
      

      或者,如果您只想要最重要的数据,您可以使用其他人提到的类似方法,您只需获取第一位数据。不到一天,这将导致&lt;y&gt; min&lt;y&gt;:&lt;z&gt;。超过一天,它会导致&lt;x&gt; days

      $ uptime | sed -e 's/^ [^ ]* up \([^,]*\).*/\1/'
      31 days
      

      最后,如果您想在小于 24 小时时反映零,您还可以选择使用 bc 或 shell 表达式对 /proc/uptime 进行一些数学运算:

      $ uptime
       13:58:41 up 31 days, 55 min,  9 users,  load average: 0.80, 0.89, 0.81
      $ echo $(( $(awk -F . '{print $1}' /proc/uptime) / 86400)) days
      31 days
      
      $ uptime
       13:59:01 up 21:18,  1 user,  load average: 0.00, 0.00, 0.00
      $ echo $(( $(awk -F . '{print $1}' /proc/uptime) / 86400)) days
      0 days
      

      【讨论】:

        【解决方案8】:

        这对我有用:

        $ uptime | grep -o "[0-9]* days"
        70 days
        

        【讨论】:

        • 这个应该更高
        【解决方案9】:
        uptime | cut -d',' -f 1 | cut -d 'p' -f 2-
        

        如果自上次重新启动后有 n 天,它将打印 n 天。如果正常运行时间少于一天,它将以 hh:mm 打印时间。

        $ uptime
        12:20  up  1:36, 1 user, load averages: 2.75 2.63 2.26
        $ uptime | cut -d',' -f 1 | cut -d 'p' -f 2-
          1:36
        

        【讨论】:

          【解决方案10】:

          以上答案是正确的,但如果你们中的任何一个想使用 awk,那么请使用:

          uptime | awk '{ print $3,$4 }'
          

          结果:

          15 days,
          

          【讨论】:

          • 如果正常运行时间少于一天,这将输出类似 5:04, 1 的内容,反映 5 小时 4 分钟和一个用户登录。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-12
          • 1970-01-01
          • 2010-09-28
          相关资源
          最近更新 更多