我们要添加以下属性:
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M
在包含单词的前两行中 -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 的前两行。
如果属性已经排队,那么下次就不会再追加!
答案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
扩展史蒂夫的答案:
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
还有一些解释:
- 在模式匹配的第一个版本中,
[+]
用于文字 + 字符,因为否则+
会被解释为特殊字符。
剩下的要点是关于第二个版本的:
- 在
BEGIN
子句中,属性字符串p
子句中,定义了。以下所有子句都适用于输入行。 {m=0}
:这个子句没有条件,这意味着它适用于每一行,这样对于每一行首先m
(用于匹配)将设置为零。/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
:这是一个没有操作的条件(始终为真),这意味着该操作默认打印输入行。