gpt4 book ai didi

linux - 从 "w"命令输出中提取正常运行时间值

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:19 25 4
gpt4 key购买 nike

如何在 Linux 上从下面的命令中获取 up 的值?

# w
01:16:08 up 20:29, 1 user, load average: 0.50, 0.34, 0.30
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 00:57 0.00s 0.11s 0.02s w

# w | grep up
01:16:17 up 20:29, 1 user, load average: 0.42, 0.33, 0.29

最佳答案

Linux 上,获取以(小数) 为单位的正常运行时间的最简单方法是通过 /proc/uptime 的第一个字段(参见 man proc):

$ cut -d ' ' -f1 /proc/uptime
350735.47

以与 w 相同的方式格式化该数字和 uptime做,使用 awk :

$ awk '{s=int($1);d=int(s/86400);h=int(s % 86400/3600);m=int(s % 3600 / 60);
printf "%d days, %02d:%02d\n", d, h, m}' /proc/uptime
4 days, 01:25 # 4 days, 1 hour, and 25 minutes

按要求回答问题 - 解析 w 的输出(uptime ,其输出与 w 的第一行输出相同,其中包含所有感兴趣的信息),也适用于 macOS/BSD,粒度为整数秒:

A perl解决方案:

<(uptime)是提供 uptime 的 Bash 进程替换的输出作为 perl 的输入命令 - 见底部。

$ perl -nle 'print for / up +((?:\d+ days?, +)?[^,]+)/' <(uptime)
4 days, 01:25

这假设days是每个显示的最大单位。

  • perl -nle告诉 Perl 逐行处理输入,默认情况下不打印任何输出(-n),自动从输入的每个输入行中删除尾随换行符,并自动在输出中附加一个换行符(-l); -e告诉 Perl 将下一个参数视为要处理的脚本(表达式)。

  • print for /.../告诉 Perl 输出每个捕获组 (...) 的内容内部正则表达式 /.../捕获。

    • up +匹配文字 up , 前面是(至少)一个空格,后面是 1 个或多个空格 ( + )
    • (?:\d+ days?, +)?是一个 非捕获 子表达式 - 由于 ?: - 匹配:

      • 1 个或多个数字 ( \d+ )
      • 后跟一个空格
      • 后跟文字 day ,可选地后跟文字 s ( s? )
      • 尾随?使整个子表达式可选,假设天数部分可能存在也可能不存在。
    • [^,]+匹配 1 个或多个 ( + ) 个后续字符,但不包括文字 , ( [^,] ) - 这是 hh:mm部分。

    • 整体捕获组——外层(...)因此捕获整个正常运行时间表达式 - 是否由 hh:mm 组成仅,或以 <n> day/s> 开头- 并打印出来。

  • <(uptime)是 Bash process substitution ( <(...) )那,松散地说,礼物uptime的输出为一个(临时的,自删除的)文件,perl可以通过标准输入读取。

关于linux - 从 "w"命令输出中提取正常运行时间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43770908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com