次の形式の構成ファイルがあります。
<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]
使用できます。-A4
grep
cat ${file} | grep -A4 "part1" | cut -d'=' -f2`
一般的な場合([part1]の後に4行以上)、sed
2つの部分の間にテキストをインポートするには:
cat ${file} | sed -n "/part1/,/part2/p" | head -n-1
head
part2
最後に重複した項目を削除するだけです。
〜のようにテデンを使用する必要がないと言えば、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]
。