首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用bash_rematch正则组操作数字

使用bash_rematch正则组操作数字
EN

Stack Overflow用户
提问于 2022-06-30 10:07:28
回答 1查看 52关注 0票数 -1

我需要解析comand的输出,并将数字转换为千字节(如果不是的话)。

来自系统的输出:

代码语言:javascript
复制
5.1g Service
227292 Xorg
218284 gnome-shell

使用我正在使用的命令不可能获得相同类型的所有结果(Kilboytes)。我需要检查来自Service的数据是否以GB或千字节为单位,并进行转换。

剧本:

代码语言:javascript
复制
#!/bin/bash

#Variables
comand=`top -b -o RES -n 1 | awk '{print $6,$NF}'| grep $1`

#Regex
regexGB="([0-9]+)(\.([0-9]+))*g"
regexKB="([0-9]+(?:\.[0-9]+)?)"
regexdigit=".*[0-9]"

if [[ $comand =~ $regexGB ]];then
        echo "Digit is in GB"
        echo "${BASH_REMATCH[*]}"

        i=1
        n=${#BASH_REMATCH[*]}
        while [[ $i -lt $n ]]
        do
            echo "  capture[$i]: ${BASH_REMATCH[$i]}"
            let i++
        done

elif [[ $comand =~ $regexKB ]];then
        echo "Digit is in KB"
else
        echo "Printing Output $1. Comand: $comand"
fi

结果:

代码语言:javascript
复制
Digit is in GB
5.1g 5 .1 1
  capture[1]: 5
  capture[2]: .1
  capture[3]: 1

我试着将${BASH_REMATCH$i * 1024相乘,但它不起作用。我怎样才能把千兆字节的数字转换成千字节呢?

EN

回答 1

Stack Overflow用户

发布于 2022-06-30 12:24:20

您可以使用bash 过程替代避免两次读取命令输出。复合if可以捕获需要计算的输出,并(可能)转换为be。使用bash参数展开和模式匹配从千兆字节输出中移除尾随的'g‘,然后转换为千字节。

代码语言:javascript
复制
#!/bin/bash

re_gb="([0-9]+)(\.([0-9]+))g"
re_kb="([0-9]+)"

while read -r line ; do
  if [[ $line =~ $re_gb || $line =~ $re_kb ]] ; then
    if [[ ${BASH_REMATCH[0]} == *g ]] ; then
        # remove the trailing 'g' from the gigabytes regex capture group
        num=${BASH_REMATCH[0]//g/}i

        # use bc for converting to kilobytes as
        # bash cannot perform multiplication on floats. 
        # Dividing by one removes the float. 
        # Remove the divide by one for decimal output.
        bc <<<"$num * 1024 * 1024 / 1"
    else
        echo "${BASH_REMATCH[0]}"
    fi
  fi
done < <(top -b -o RES -n 1 | awk '{print $6,$NF}'| grep $1)

使用命令中的输出示例:

代码语言:javascript
复制
5.1g Service
227292 Xorg
218284 gnome-shell

脚本输出将是:

代码语言:javascript
复制
$ ./script
5347737
227292

218284

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72813931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档