如何用awk将文件1的volumeMonitorConfig下whitelistSelectorRegex更新至文件2
使用awk将文件1的volumeMonitorConfig配置同步到文件2
实现思路
- 从文件1中提取
volumeMonitorConfig区块下whitelistSelectorRegex的具体值 - 用提取到的值替换文件2中对应区块的同配置项内容
具体命令
步骤1:验证提取目标值(可选)
先单独提取文件1里的目标配置值,确认是否正确:
awk '/volumeMonitorConfig:/{in_volume=1} in_volume && /whitelistSelectorRegex/{print $3; exit}' file1.yaml
执行后会输出"/opt/xyz",即我们需要同步的目标值。
步骤2:批量替换生成更新文件
将提取和替换合并为一条命令,直接生成更新后的文件:
TARGET_VAL=$(awk '/volumeMonitorConfig:/{in_volume=1} in_volume && /whitelistSelectorRegex/{print $3; exit}' file1.yaml) && \ awk -v val="$TARGET_VAL" '/volumeMonitorConfig:/{in_volume=1} in_volume && /whitelistSelectorRegex/{sub(/"[^"]*"/, val); in_volume=0} 1' file2.yaml > file2_updated.yaml
命令解释
- 提取值部分:
/volumeMonitorConfig:/{in_volume=1}:匹配到volumeMonitorConfig:行时,标记进入该配置区块in_volume && /whitelistSelectorRegex/{print $3; exit}:在区块内找到目标配置行时,打印第三个字段(引号包裹的正则值),然后退出awk避免处理后续无关内容
- 替换部分:
-v val="$TARGET_VAL":把提取到的值传递给awk内部变量val/volumeMonitorConfig:/{in_volume=1}:同样标记进入目标配置区块in_volume && /whitelistSelectorRegex/{sub(/"[^"]*"/, val); in_volume=0}:匹配到目标配置行时,用val替换引号内的所有内容,然后标记退出区块(防止误改其他区块的同名配置)1:awk中1表示执行默认操作(打印当前行),确保所有行都被输出> file2_updated.yaml:将结果写入新文件,避免直接覆盖原文件(验证无误后可手动替换原文件)
注意事项
- 确保两个YAML文件中
volumeMonitorConfig区块下的whitelistSelectorRegex行格式一致(缩进、冒号空格、引号包裹方式相同) - 如果目标值包含特殊正则字符(如
*、/),本命令中的sub操作依然有效,因为我们是直接替换引号内的内容,未将目标值作为正则匹配规则
内容的提问来源于stack exchange,提问作者Jarugula Suresh Chandra
相关产品推荐
相关产品推荐

