次の属性を追加しようとしています。
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M
- という単語を含む最初の2行HBASE_MASTER_OPTS
変更前の例:
more ams-hbase-env-template.txt
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=71 -XX:+UseCMSInitiatingOccupancyOnly"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=72 -XX:+UseCMSInitiatingOccupancyOnly"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=73 -XX:+UseCMSInitiatingOccupancyOnly"
変更された例(予想結果):
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=71 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=72 -XX:+UseCMSInitiatingOccupancyOnly"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=73 -XX:+UseCMSInitiatingOccupancyOnly"
これまで私がしたことは次のとおりです。
sed -i '/HBASE_MASTER_OPTS/ s/$/-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M/' ams-hbase-env-template.txt
しかし、これは次の理由で間違っています。
私たちは二重引用符が終わる前に属性が欲しいです。
属性は、HBASE_MASTER_OPTS変数の最初の2行にのみ必要です。
属性がすでにキューにある場合は、次に追加されません。
答え1
このソリューションはどうですかawk
?問題から目的の出力を生成します。
awk '/HBASE_MASTER_OPTS/&&x<2{gsub(/"$/," -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M\"");x++}1' ams-hbase-env-template.txt
答え2
Steveの答えを拡張すると、次のようになります。
awk '/HBASE_MASTER_OPTS/&&/ -XX:[+]UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M/{x++;print;next}/HBASE_MASTER_OPTS/&&x<2{gsub(/"$/," -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M\"");x++}1' ams-hbase-env-template.txt
更新:以下は、各文字列が一度だけ表示されるメンテナンスが簡単なバージョンです。
awk 'BEGIN{p="-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M"}{m=0}/HBASE_MASTER_OPTS/{m=1;++x}m&&index($0,p){print;next}m&&x<=2{gsub(/"$/," " p "\"")}1' ams-hbase-env-template.txt
いくつかの説明があります。
- パターンマッチングの最初のバージョンでは、
[+]
リテラル+文字が使用されました。そうでなければ、+
特殊文字として解釈されるからです。
残りのポイントは、2番目のバージョンについてです。
- In
BEGIN
句、属性文字列p
句が定義されました。次のセクションはすべて入力行に適用されます。 {m=0}
:このセクションには条件はありません。つまり、すべての行に適用されるため、すべての行に対して最初にm
(一致する場合)0に設定されます。/HBASE_MASTER_OPTS/{m=1;++x}
:行がHBASE_MASTER_OPTS
文字列と一致すると、m
その行が設定され、ラインカウンタがインクリメントされます。m&&index($0,p){print;next}
:この句は、とマークされている一致を確認するだけでなく、m
入力行に属性文字列が含まれていることを確認します。この場合、index
ゼロ以外の値が返されます。その場合は、行をそのまま印刷し(属性が追加されなくなりました)、next
残りの句をスキップして次の行処理を開始します。以下の用語はもともとSteveによって提供され、私だけが適用したものです。m&&x<=2{gsub(/"$/," " p "\"")}
:この点に到達し、一致する行があり、カウンタが2を超えない場合は、$0
端末の前にスペースと"
変更する属性文字列(入力行)を追加して修正(入力行)します。それ以外の場合、出力は生成されず、これは次のセクションで行われます。1
:これはジョブがない条件(常にtrue)です。つまり、ジョブがデフォルトで入力行を印刷することを意味します。