제공되는 문서:
$ cat CronConfig
`FILE SYSTEM`
`------------`
warningThreshold: 77
criticalThreshold: 99
`MEMORY`
`-------`
warningThreshold: 66
criticalThreshold: 88
`CPU`
`----`
intervalCount: 6
intervalSecs: 7
warningThreshold: 99
criticalThreshold: 88
CronConfig
위 내용이 포함된 파일이 있습니다. 나는 값을 사용 하고 warningThreshold
다음 과 같은 출력을 원합니다.MEMORY
criticalThreshold
CPU
66
88
이 값을 얻으려면 명령을 사용하십시오. (하지만 올바른 방법으로 수행하고 있는지 확실하지 않습니다.)
awk 'BEGIN{FS="\n"; RS="------------"} {print $7}' CronConfig | awk 'NF {print $2}'
awk 'BEGIN{FS="\n"; RS="------------"} {print $15}' CronConfig | awk 'NF {print $2}'
답변1
sed
여러 줄을 교체하여 이 작업을 수행할 수 있습니다.
요컨대
$ sed -n '/`MEMORY`/,/^$/{s/^warningThreshold: \([0-9]*\)/\1/p};
/`CPU`/,/^$/{s/^criticalThreshold: \([0-9]*\)/\1/p}' CronConfig
더 많은 설명이 있습니다:
sed -n
전체 파일을 인쇄하지 마세요.
검색할 블록을 선택하려면
/PATTERN1/,/PATTERN2/
여기서 PATTERN1과 PATTERN2는 블록 제한입니다. 귀하의 경우 MEMORY
첫 번째 블록과 두 번째 블록에 end를 사용할 수 있습니다 .^$
CPU
^$
그런 다음 warningThresholt 또는 importantThreshold가 포함된 줄을 다음 숫자로 바꾸면 됩니다. s
이를 수행하기 위해 sed 명령을 사용하겠습니다 . 끝에 있는 s 명령 p
은 결과를 에코하는 데 사용됩니다.
답변2
원하는 모든 값에 대해 작동하는 AWK 솔루션(제 awk는 다차원 배열을 지원하지 않으므로 배열 인덱스에 "|"를 사용하면 모든 awk 버전에서도 작동합니다):
$ awk -F'`' '
/[A-Z][A-Z]+/ {matchkey=$2}
!/[-]+/ && !/[A-Z][A-Z]+/ && $0 {
split($0,values,":");
for ( i in values ) gsub(" ","",values[i]);
ar[matchkey"|"values[1]]=values[2];
}
END {print ar["MEMORY|warningThreshold"];print ar["CPU|criticalThreshold"]}
' CronConfig
66
88
END 블록에서는 원하는 값을 얻을 수 있습니다.
예: print ar["CPU|intervalCount"]
값을 인쇄합니다."6"입력 파일에서.
답변3
사용 GNU sed
및 기타 도구:
$ sed -ne '
/^`CPU`$/{
:a;n;s/^criticalThreshold: //p;Ta
}
/^`MEMORY`$/{
:b;n;s/^warningThreshold: //p;Tb
}
' cinfigFile
$ perl -lane '
print $F[1] if
(/^`MEMORY`$/ ... /^$/ and /^warningThreshold:/)
||
(/^`CPU`$/ ... /^$/ and /^criticalThreshold:/);
' configFile
$ awk -F'\n' -vRS= '
/^`MEMORY`\n/&&match($0,/\nwarningThreshold: [0-9]+/){
print substr($0, RSTART+19, RLENGTH-19) }
/^`CPU`\n/&&match($0,/\ncriticalThreshold: [0-9]+/){
print substr($0, RSTART+20, RLENGTH-20) }
' configFile
$ perl -F'\n' -ln -00 -e '$,=$\;
$h{ ($F[0] =~ /`(.*)`/)[0] } = { /^\s*(.*):\s*(.*)$/mg };
print $h{MEMORY}{warningThreshold}, $h{CPU}{criticalThreshold} if eof;
' configFile