我有一个 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
。