우리는 다음 속성을 추가하려고 합니다.
-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
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
몇 가지 설명이 있습니다.
- 패턴 일치의 첫 번째 버전에서는
[+]
리터럴 + 문자가 사용되었습니다. 그렇지 않으면+
특수 문자로 해석되기 때문입니다.
나머지 요점은 두 번째 버전에 관한 것입니다.
- 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
0이 아닌 값이 반환됩니다. 그렇다면 행을 있는 그대로 인쇄하고(더 이상 속성이 추가되지 않음)next
나머지 절을 건너뛰고 다음 행 처리를 시작합니다. 다음 용어는 원래 Steve가 제공했으며 나만이 적용한 것입니다.m&&x<=2{gsub(/"$/," " p "\"")}
: 이 지점에 도달하고 일치하는 라인이 있고 카운터가 2를 초과하지 않는 경우$0
터미널 앞에"
공백과 수정할 속성 문자열(입력 라인)을 추가하여 수정(입력 라인)합니다. 그렇지 않으면 출력이 생성되지 않으며 이는 다음 절에서 수행됩니다.1
: 이는 작업이 없는 조건(항상 true)입니다. 즉, 작업이 기본적으로 입력 줄을 인쇄한다는 의미입니다.