2

我需要编写一个脚本来对长字符串执行一些魔术并更改输出。除了一部分之外,我可以轻松地完成大部分脚本。

如果我有一个 bash 脚本

data = “CRITICAL - mempool lsmpi_io usage is 99.99%, mempool Processor usage is 34.38% | 'Processor_usage'=34.38%;80;90 'lsmpi_io_usage'=99.99%;80;90”

我需要总是出现在“'Processor_usage'=”之后的信息

我需要执行哪些命令才能执行

$p=34.38
$w=80
$c=90

请记住,百分比可能只是个位数。

4

5 回答 5

4

Bash 有内置的正则表达式支持;绝对没有理由使用 sed 等外部​​工具。

data="CRITICAL - mempool lsmpi_io usage is 99.99%, mempool Processor usage is 34.38% | 'Processor_usage'=34.38%;80;90 'lsmpi_io_usage'=99.99%;80;90"
data_re="'Processor_usage'=([0-9.]+)%?;([0-9.]+)%?;([0-9.]+)%?"
if [[ $data =~ $data_re ]]; then
  p=${BASH_REMATCH[1]}
  w=${BASH_REMATCH[2]}
  c=${BASH_REMATCH[3]}
fi
于 2013-08-26T21:28:51.437 回答
1

纯 bash 解决方案:

data=${data##*\'Processor_usage\'=}
data=${data%% *}
IFS=';' read p w c <<< "$data"


echo "p=${p%\%}" # or echo "p=${p:0:-1}"
echo "w=$w"
echo "c=$c"

会输出这个:

p=34.38
w=80
c=90
于 2013-08-26T21:09:43.910 回答
0

例如,您可以使用 sed。遵循一个示例来标记您指向的字符串:

#!/bin/sh

DATA="CRITICAL - mempool lsmpi_io usage is 99.99%, mempool Processor usage is 34.38% | 'Processor_usage'=34.38%;80;90 'lsmpi_io_usage'=99.99%;80;90"

echo "$DATA" | sed "s@.*'Processor_usage'=\([0-9.]*\)%;\([0-9.]*\);\([0-9.]*\) .*@\1 \2 \3@" | while read p w c; do
    echo p=$p
    echo w=$w
    echo c=$c
done
于 2013-08-26T21:01:44.537 回答
0

如果此文本在文件中:

data = “CRITICAL - mempool lsmpi_io usage is 99.99%, mempool Processor usage is 34.38% | 'Processor_usage'=34.38%;80;90 'lsmpi_io_usage'=99.99%;80;90”

此命令将满足您的要求:

IFS=';' read p w c < <(sed -n "/Processor_usage/{ s|.*'Processor_usage'=||; s| .*||; s|%||g; p; }" file)
于 2013-08-26T21:09:33.137 回答
0

这应该有效:

read p w c < <(grep -oP "(?<='Processor_usage'=)[^\s]+" <<< $data | tr ';' ' ')

echo -e "p=${p}\nw=${w}\nc=${c}"
p=34.38%
w=80
c=90
于 2013-08-26T21:10:53.243 回答