提供される文書:
$ 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
最初のブロックと2番目のブロックに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