我要替换yml文件中每个日志的路径,下面是我的文件
filebeat.inputs:
- type: log
enabled: true
fields.type: spark
paths:
- /var/log/*.log
- type: log
enabled: true
fields.type: kafka
paths:
- /var/log/*.log
我不知道如何替换具有多个相同类型的值,即-type:log 通常,对于示例文件,我使用以下行:
sed -i -e '/^ *ssl:/,/^ *[^:]*:/s/enabled: true/enabled: false/' test2.yaml
更改内容后,其外观应为:
filebeat.inputs:
- type: log
enabled: true
fields.type: spark
paths:
- /var/log/spark/*.log
- type: log
enabled: true
fields.type: kafka
paths:
- /var/log/kafka/*.log
答案 0 :(得分:0)
您应该使用真实的解析器从YAML或在更新YAML文件时获取值。
sed
并不是执行此类复杂操作的适当工具,尤其是当有人迁移时
在您的fields.type
和paths
行之间插入另一个键值对,或将一个项目附加到
路径值的顺序。
在文件input.yaml
中输入内容,并安装ruamel.yaml
(pip install ruamel.yaml
)和脚本:
import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML()
data = yaml.load(sys.stdin)
for item in data['filebeat.inputs']:
try:
ft = item['fields.type']
paths = item['paths']
for idx, path in enumerate(paths):
pre, post = path.rsplit('/', 1)
paths[idx] = pre + '/' + ft + '/' + post
except Exception as e:
print(e)
pass
yaml.dump(data, sys.stdout)
您可以这样做:
< input.yaml python update.py > output.yaml
获得:
filebeat.inputs:
- type: log
enabled: true
fields.type: spark
paths:
- /var/log/spark/*.log
- type: log
enabled: true
fields.type: kafka
paths:
- /var/log/kafka/*.log
如果paths
下有多个项目,则它们都将被更新(假设路径中至少有一个/
)。
答案 1 :(得分:0)
您无法通过sed命令直接实现此目的。 您需要进行YAML解析,并根据需要在解析后的数据上调用必要的sed命令。