如何提取特定字符串后的特定值并将其存储到不同的变量中?

如何提取特定字符串后的特定值并将其存储到不同的变量中?

我对 Linux 很陌生。我需要解析在自动化结束时生成的一个摘要文件。下面是该摘要文件:

Total_Test_Cases_Count:25
Total_Pass:24
Total_Fail:1
Execution_Duration:5m 7sec
Pass_Percentage:96.11%
Failure_Percentage:3.89%

我希望这些值单独存在于变量中,以便我可以将其传递给其他函数。

我的预期输出:

Total_Test_Cases_Count(as a variable) with value 25.
Total_Pass(as a variable) with value 24.

对于其他人来说也是如此。

到目前为止我尝试过的:

awk "NR==1" summary.txt

这使

TotalCount:25

答案1

最好使用关联数组来完成此操作。例如

declare -A array

while IFS=: read key val; do
  array["$key"]="$val"
done < input.txt

for key in Total_Test_Cases_Count Total_Pass; do
  printf '%s=%s\n' "$key" "${array[$key]}"
done

输出:

Total_Test_Cases_Count=25
Total_Pass=24

如果任何值包含字段分隔符(冒号,:),此操作将会失败。在这种情况下,您首先需要将输入中的字段分隔符更改为两个字段中都不存在的分隔符。选项卡通常是一个不错的选择。例如:

while IFS=$'\t' read key val; do
  array["$key"]="$val"
done < <(sed -e 's/:/\t/1' input.txt)

IFS 设置为使用制表符作为分隔符,并且该sed命令将第一个(且仅第一个)冒号字符更改为制表符。

答案2

使用 awk 和 eval:

eval "$(awk -F: '{ print $1 "='\''" $2 "'\''" }' tmp)"

里面的命令$()解析summary.txt。通过该-F选项,我们告诉 awk 用作:字段分隔符。它格式化每一行,如下所示:

Total_Pass='24'

我不得不转义单引号;这就是为什么代码看起来如此丑陋。

eval 用于执行格式化文本,就像您在脚本中编写的那样。你可以猜到这是危险的如果您无法完全控制输入数据。看为什么在 Bash 中应该避免 eval,我应该使用什么来代替?也许有人可以指出一种更安全的方法来做到这一点。

然后您可以像这样使用新变量:

printf "Total_Pass with value %s\n" "$Total_Pass"

相关内容