特定の文字列の後に特定の値を抽出して別の変数に保存する方法は?

特定の文字列の後に特定の値を抽出して別の変数に保存する方法は?

私は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を解析する内部コマンドです$()。このオプションを使用すると、awkにフィールド区切り文字-Fとして使用するように指示します。:各行の形式は次のとおりです。

Total_Pass='24'

しなければならなかった一重引用符をエスケープする;だからコードが見えないようです。

eval は、スクリプトで書かれているように書式設定されたテキストを実行するために使用されます。推測できるのはこれだ。危険入力データを完全に制御できない場合。バラよりBashでevalを避けるべき理由は何ですか。代わりに何を使用する必要がありますか?たぶん、誰かがこれを行うより安全な方法を指摘できます。

その後、次のように新しい変数を使用できます。

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

関連情報