【问题标题】:Bash string replace on command result在命令结果上替换 Bash 字符串
【发布时间】:2014-12-06 07:30:36
【问题描述】:

我有一个简单的 bash 脚本,它使用 uptime 和 awk 来获取平均负载,例如

LOAD_5M=$(uptime | awk -F'load averages:' '{ print $2}' | awk '{print $2}')

但是,这在平均负载末尾包含一个“,”

例如

0.51,

所以我用字符串替换了逗号,如下所示:

LOAD_5M=${LOAD_5M/,/}

我不是 awk 或 bash wizzkid,所以虽然这给了我想要的结果,但我想知道是否有一种简洁的方式来写这个,或者通过:

  • 使用 awk 获取不带逗号的负载平均值,或
  • 在一行中去掉逗号

【问题讨论】:

    标签: bash shell awk


    【解决方案1】:

    您可以在同一个 awk 命令中执行此操作:

    uptime | awk -F 'load averages?: *' '{split($2, a, ",? "); print a[2]}'
    1.32
    

    【讨论】:

    • 我注意到有些操作系统在每个平均值之间包含一个逗号,而有些则没有,如果它不存在,这将不起作用,但如果我将拆分更改为 split($2,a,",? "),我认为它看起来不错。
    • 是的,我在 OSX 上测试过,发现这里有逗号。否则split($2,a,",? ") 会更好。
    【解决方案2】:

    /proc/loadavg 中提供了 5 分钟加载。你可以简单地使用cut:

    cut -d' ' -f2  /proc/loadavg
    

    使用awk,您可以发出:

    awk '{print $2}' /proc/loadavg
    

    如果您不在 Linux 上工作,则文件 /proc/loadavg 将不存在。在这种情况下,我建议使用sed,如下所示:

    uptime | sed 's/.*, \(.*\),.*,.*/\1/'
    

    【讨论】:

    • 我喜欢这个,直到我在 Mac 上试用它并得到了cut: /proc/loadavg: No such file or directory,所以认为正常运行时间有点跨平台。
    • 这里也一样,我也在 Mac 上试过,但没有用。可能这是 Linux 唯一的把戏
    • @murdoch 使用 Linux 的另一个原因。 ;)
    • @murdoch 顺便说一句,您可以在 Mac OS(或 BSD)上使用 sed: uptime | sed 's/.*, \(.*\),.*,.*/\1/' ... 将其添加到我的答案中
    【解决方案3】:
    uptime | awk -F'load average:' '{ print $2}' | awk -F, '{print $2}'
    0.38
    

    (我的正常运行时间输出具有“平均负载:”单数)

    【讨论】:

      【解决方案4】:

      负载平均数始终是“正常运行时间”输出中的最后 3 个字段,因此:

      IFS=' ,' read -a uptime_fields <<<"$(uptime)"
      LOAD_5M=${uptime_fields[@]: -2:1}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-28
        • 2023-04-11
        • 2017-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        相关资源
        最近更新 更多