ファイルの特定部分の値を取得します。

ファイルの特定部分の値を取得します。

次の形式の構成ファイルがあります。

<Title>
 [part1]
  A.File = a
  A.Val = val1
  B.File = a
  B.Val = val1
 [part2]
  A.File = a1
  A.Val = val2 
  B.File = a
  B.Val = val1

最初の部分からのみ値を抽出したいと思います。

 #!/bin/sh 
getCalibDate()
{
 file="/path/of/config/file"
 value=`cat ${file} | grep Val | cut -d'=' -f2`
    for v in $value
    do
            echo $v
    done
}
getCalibDate

上記のスクリプトはすべての値を返します。最初の部分(part1)でのみ値を取得するにはどうすればよいですか?

答え1

それ以降に4行しかない場合は、次のオプションを[part1]使用できます。-A4grep

cat ${file} | grep -A4 "part1" | cut -d'=' -f2`

一般的な場合([part1]の後に4行以上)、sed2つの部分の間にテキストをインポートするには:

cat ${file} | sed -n "/part1/,/part2/p" | head -n-1

headpart2最後に重複した項目を削除するだけです。

〜のようにテデンを使用する必要がないと言えば、cat次のことができます。

grep -A4 "part1" ${file} | cut -d'=' -f2`

または:

sed -n "/part1/,/part2/p" ${file} | head -n-1

答え2

ファイルを解析するには、より洗練されたツールを使用する必要があります。たとえば、awk:

#!/bin/sh 

getCalibDate()
{
 file="${1}"
 value=$(awk  '/\[part/{a++}(a<2 && /Val/){print $NF}' ${file})

    for v in $value
    do
            echo $v
    done
}

getCalibDate ${1}

aここでは、行が一致するたびに変数が増加します[part。行が一致すると、$NF最後のフィールド()が2より小さく最初のセクションにあるVal場合にのみ印刷されます。a

答え3

これを使用してください:

sed -n -e '/\[part1\]/,/\[part2\]/p' FILE |sed -e '1d;$d'| awk -F "=" '{print $2}'

出力は次のとおりです

 a
 val1
 a
 val1

答え4

ここにはいくつかの良い答えがありますが、質問の一部を扱う答えだけを見ましたが、Valそれが正しいかどうかはわかりません。私はawkこれが「素晴らしいツール」であることに同意しますが、ここでは必要ありませんsed

sed -n '/\[part1\]/,/\[part2\]/s/.*Val.*=//p' "$file"

必要なこともできます。他のsed -e '/\[part1\]/,/\[part2\]/p'解決策と同様に(インターネット専門家 そして赤ちゃん)、どの部分を選択しても簡単に適用できます。 (もちろん名前を知る必要があり、序数だけ知れば適応できます。テドンの答え またはグレンジャックマンの答え、そのうち二計算セクションで特定の名前を見つけるのではなく)次のセクションの名前がわからない場合は、次のことができます。

sed -n '/\[part42\]/,/\[部分/は...'"$file"

例えば。

私の唯一のメタ質問はcut -d'=' -f2質問の一部についてです。データを抽出する入力行の後に複数の=文字が含まれている場合Val(つまり、フィールド値に=文字が含まれている場合)、たとえば、次のようになります。

Einstein.Val = E=mc^2

これにより、上記のcutコマンドは最初と2番目の間のテキスト= (つまり最初のフィールド値(含まれていない))のみを抽出します。=たとえば。 E上記で指定したコマンドは、次のsedテキストのみを抽出します。最後 =(たとえば、mc^2)。最初のアイテム以降のすべてのアイテム=(たとえばE=mc^2)をインポートするには、次のようにします。

sed -n '/\[part1\]/,/\[part2\]/s/.*Val[^=]*=//p' "$file"

cut(たとえば)の動作を模倣するには、 E次のようにします。

sed -n '/\[part1\]/,/\[part2\]/s/.*Val[^=]*=\([^=]*\).*/\1/p' "$file"

私のアプローチでは、データは少なくとも一般的に質問の図に似ていると仮定しています。つまり、=文字列の右側のどこかに少なくとも1つ発生しますVal。したがって、私のすべてのソリューションは入力を無視します。

Girl.Name = Valerie
Valerie Bertinelli

[part1]〜の間に該当しても[part2]

関連情報