Como adicionar propriedades no final das duas primeiras linhas com aspas duplas?

3

Queremos adicionar as seguintes propriedades:

-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M

nas duas primeiras linhas que contêm a palavra - HBASE_MASTER_OPTS

Exemplo antes da mudança :

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"

Exemplo após alteração (resultados esperados) :

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"

O que eu fiz até agora é que:

sed -i '/HBASE_MASTER_OPTS/ s/$/-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M/' ams-hbase-env-template.txt

Mas isso não está certo porque:

  1. Queremos as propriedades antes do final das aspas duplas.

  2. As propriedades devem estar apenas nas duas primeiras linhas em que a variável é HBASE_MASTER_OPTS.

  3. Caso as propriedades já estejam em linha, elas não serão anexadas novamente na próxima vez!

por yael 13.08.2018 / 20:54

2 respostas

2

Estendendo a resposta de 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

Update: Aqui está uma versão mais amigável para manutenção, onde cada string só ocorre uma vez.

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

E alguma explicação:

  • Na primeira versão da correspondência de padrão, [+] é usado para o caractere literal +, porque senão + seria interpretado como caractere especial.

Os pontos restantes são sobre a segunda versão:

  • Na cláusula BEGIN , a sequência de propriedades p é definida. Todas as cláusulas a seguir se aplicam às linhas da entrada.
  • {m=0} : Esta cláusula não tem condição, o que significa que se aplica a todas as linhas, de modo que para cada linha, primeiro m (para correspondência) será definida como zero.
  • /HBASE_MASTER_OPTS/{m=1;++x} : se uma linha corresponder à string HBASE_MASTER_OPTS , m será definido e nosso contador de linha será incrementado.
  • m&&index($0,p){print;next} : esta cláusula verifica se, além de uma correspondência indicada por m , também a cadeia de propriedades está contida na linha de entrada. Nesse caso, index retornará um valor diferente de zero. Nesse caso, imprimimos a linha como está (não adicionando as propriedades novamente) e com next ignoramos as cláusulas restantes e começamos a processar a próxima linha. Note que as cláusulas a seguir foram originalmente fornecidas por Steve e apenas adaptadas por mim:
  • m&&x<=2{gsub(/"$/," " p "\"")} : se chegarmos a este ponto e tivermos uma linha correspondente e nosso contador não tiver excedido 2, modificamos $0 (a linha de entrada) ao prefixar o terminal " com um espaço em branco e nossa cadeia de propriedades. Além disso, nenhuma saída é produzida, o que será feito pela próxima cláusula.
  • 1 : esta é uma condição (sempre verdadeira) sem uma ação, o que significa que a ação é padronizada para imprimir a linha de entrada.
por 14.08.2018 / 00:52
3

Que tal esta awk solução. Cria a saída desejada na pergunta.

awk '/HBASE_MASTER_OPTS/&&x<2{gsub(/"$/," -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M\"");x++}1' ams-hbase-env-template.txt

Experimente online!

    
por 14.08.2018 / 00:24