提供的文件:
$ cat CronConfig
`FILE SYSTEM`
`------------`
warningThreshold: 77
criticalThreshold: 99
`MEMORY`
`-------`
warningThreshold: 66
criticalThreshold: 88
`CPU`
`----`
intervalCount: 6
intervalSecs: 7
warningThreshold: 99
criticalThreshold: 88
CronConfig
我有一个包含上述内容的文件。我想使用warningThreshold
fromMEMORY
和criticalThreshold
from的值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 或 criticalThreshold 的行替换为以下数字。我将使用s
sed 命令来完成此操作。结尾p
的 s 命令用于回显结果。
答案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