使用 bash 对函数输出进行正则表达式,以使用找到的正则表达式组来评估另一个函数

使用 bash 对函数输出进行正则表达式,以使用找到的正则表达式组来评估另一个函数

我有一个 bash 函数 FUNCTION_A ,其输出如下所示:

    ID          HELD_SINCE  HOLD_REASON
    123456.0   7/1  20:40 Peak usage: 2370 megabytes.
    123457.0   7/1  20:40 Peak usage: 5008 megabytes.

然后我需要获取ID number和后面的数字Peak usage:以传递给 FUNCTION_B。

如果我手动运行它,它看起来像:

FUNCTION_B 123456.0 2370
FUNCTION_B 123457.0 5008

我正在尝试使用正则表达式编写一个 bash 脚本来获取这两个数字并在 shell 中运行任意数量的FUNCTION_A.我被困在几个不同的地方。

我不确定如何逐行循环输出,并且我不确定为什么数组不保存任何输出,但我想做这样的事情

re='([0-9-]+\.[0-9-]+).*Peak usage: ([0-9-]+) megabytes\.'
for line in FUNCTION_A output
   if [[ line =~ $re ]]; then
      myArray=($(echo s | egrep -Eo re))
      eval FUNCTION_B ${myArray[0]} ${myArray[1]}
   fi  

答案1

您可以在 bash 中使用捕获括号:use变量BASH_REMATCH

function_A_output=$(FUNCTION_A)

re='([0-9-]+\.[0-9-]+).*Peak usage: ([0-9-]+) megabytes\.'
while IFS= read -r line; do
   if [[ $line =~ $re ]]; then
      FUNCTION_B "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
   fi  
done <<<"$function_A_output"

没有eval要求。

用一个流程替代,我们不需要 $function_A_output 变量:

re='([0-9-]+\.[0-9-]+).*Peak usage: ([0-9-]+) megabytes\.'
while IFS= read -r line; do
   if [[ $line =~ $re ]]; then
      FUNCTION_B "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
   fi  
done < <$(FUNCTION_A)
# ....^ that space is intentional

答案2

我不会在 bash 或 sh 的任何方言中写这个(出于评论中已经提到的原因),但似乎您正在尝试从一个函数的输出中提取数值,并将它们一次传递两个到第二个功能?

如果这是正确的,你可以这样做:

re='([0-9-]+\.[0-9-]+).*Peak usage: ([0-9-]+) megabytes\.'
while read -r a b ; do
  FUNCTION_B "$a" "$b"
done < <(FUNCTION_A | sed -nE "s/$re/\1 \2/p")

不过,我并不完全确定我相信这一点 - 无论是什么都太容易$re破坏 sed 脚本了。最好通过 awk 的-v选项将 $re 传递给 awk,或者作为导出的环境变量传递给 awk 或 perl。

例如

export re='([0-9-]+\.[0-9-]+).*Peak usage: ([0-9-]+) megabytes\.'
while read -r a b ; do
  FUNCTION_B "$a" "$b"
done < <(FUNCTION_A | perl -n -e 'print "$1 $2\n" if m/$ENV{re}/')

但是,我强烈建议您花一些时间学习awk和/或perl. sed还有grep

相关内容