ファイルからデータを抽出し、いずれかの値に基づいてファイル名を構成する方法

ファイルからデータを抽出し、いずれかの値に基づいてファイル名を構成する方法

構成ファイルから2つの値を抽出して新しいファイルに書き込もうとします。難しい部分は、新しいファイルの名前が入力ファイルの値の1つによって決まるようにしたいということです。

私が抽出したい値は、「Build_Version」とDocker名の4桁の略語(「docker_Name」)です。たとえば、ファイルにが表示されている場合は、docker_Name='bcbs_pr-app-01'「bcbs」のみが必要です。 bcbs_build.txt.

以下はログファイルから抜粋したものです。

nonSSL_port=80  # FOR STAGING 
Build_Type=prod 
Build_Version=9.0.00.01_134143 
docker_Name='bcbs-pr-app-01'

必要なファイル出力は次のとおりです。

bcbs
9.0.00.01_134143 

sed私が望む値を抽出する命令を見つけました。

sed -n -e '/Build_Version=/p' -e '/docker_Name=/p' environment-info.conf > build_version.txt

ただし、これを行うとBuild_Version=合計行が完全に抽出されますが、Build_Versionとdocker nameの値のみが必要です。docker_Name=4文字のDocker名の略語(bcbs)を使用してファイル名を指定する方法を理解する必要があります。

答え1

ファイルはsh構文のように見えます。したがって、そのファイルが実際にshスクリプトに含めたい構成ファイルである場合は、次のようにします。

. ./environment-info.conf &&
  printf '%s\n' "${docker_Name%%-*}" "$Build_Version" > "${docker_Name%%-*}_build.txt"

答え2

1)sedを a) 最初の一重引用符を削除docker_Name, b) 削除-pr-app-01'(最後の一重引用符を含む), c)<value>=部分を削除:

 sed -n "/Build_Version=/s/.*=//p;/docker_Name=/s/.*=//;s/'//;s/-.*//p"

whereをat ingラインに/match/s/pattern/replacement/置き換えます。空の文字列であれば効果的に削除されます。文字列内の単一引用符を処理するために単一引用符から二重引用符に切り替え、ワイルドカードを使用してより複雑な文字列を一致させ、コマンドをセミコロンと組み合わせることができます。patternreplacementmatchreplacement* .sed

2)BASH両方の結果を配列として読み込みます。

values=( $( sed -n "/Build_Version=/s/.*=//p;/docker_Name=/s/.*=//;s/'//;s/-.*//p" file ) )

場所array=( value1 value2 value3 )$(do this command)

3) 私達はこの配列を私達の目的に合うように使用します。カウンターは次から始まります0

echo ${values[1]} > ${values[1]}
echo ${values[0]} >> ${values[1]}

配列名と項目のインデックスで配列項目のアドレスを指定します${array[intex]}

答え3

ぜひこれを使うべきですかsedgrepそしてperl必要なことをすることができます。

grep 'Build_Type\|docker_Name' environment-info.conf | perl -pe "s|docker_Name='(.*?)-.*|docker_Name=\1|" > build_version.txt

答え4

docker名の4文字を使用してファイル名を指定する方法を探しています。これは、File_Nameという変数に4つの文字を割り当てる次のコマンドを使用して実行できます。

File_Name=`cat file | grep "docker_Name" | awk -F"'" '{print $2}' | awk -F'-' '{print $1}'`

上記の答えで述べたように、次のコマンドは docker_Name と build_version を value という配列に割り当てます。

values=($(sed -n "/docker_Name=/s/.*=//;s/'//;s/-.*//p;/Build_Version=/s/.*=//p" file))

目的の方法で出力をキャプチャするために、逆の順序で配列にアクセスします。

for i in 1 0; do echo ${values[$i]} >> $File_Name.txt; done

ファイルは目的の名前で準備され、catはその内容を表示します。

% cat bcbs.txt
bcbs
9.0.00.01_134143

関連情報