使用bash_rematch regex组对数字进行操作



我需要解析命令的输出,如果不是,则处理这些数字以将其转换为千字节。

输出系统:

5.1g Service
227292 Xorg
218284 gnome-shell

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

脚本:

#!/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
结果:

Digit is in GB
5.1g 5 .1 1
capture[1]: 5
capture[2]: .1
capture[3]: 1

我尝试乘以${BASH_REMATCH[$ I] * 1024,但它不工作。如何将以千兆字节为单位的数字转换为千字节?

您可以使用bash进程替换来避免读取两次命令输出。复合if可以捕获需要计算并(潜在地)转换为千字节的输出。使用bash参数展开和模式匹配从千兆字节输出中删除后面的'g',然后转换为千字节。

#!/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)

使用命令中的输出示例:

5.1g Service
227292 Xorg
218284 gnome-shell

脚本输出将是:

$ ./script
5347737
227292

218284年

相关内容

  • 没有找到相关文章

最新更新