我是打击脚本的新手,我正在寻找解释开发脚本时思考过程的答案。
我在配置文件中有一个主机列表,但需要将其转换为YAML。我需要从配置中删除主机名和IP并为其生成新的配置。
那么如何识别和删除第一组信息,然后将其插入到新的集合中。
<Host "HOSTNAME">
Address "10.10.10.10"
Version 2
Community "STRINGHERE"
Collect "linux_cpu_wait_raw" "linux_cpu_nice_raw" "linux_cpu_kernel_raw" "linux_mem_total" "linux_mem_avail" "linux_load"
</Host>
应该是这样的
'HOSTNAME':
Address: '10.10.10.10'
Version: 2
Community: 'STRINGHERE'
Collect: ['linux_cpu_wait_raw', 'linux_cpu_nice_raw', 'linux_cpu_kernel_raw', 'linux_mem_total', 'linux_mem_avail', 'linux_load']
我很难找到一个例子去做我想要达到的目标。
谢谢,
我欣赏任何方向。
答案 0 :(得分:0)
awk
救援!
如果您没有专门的工具,可以破解像这样的脚本
$ awk -v q="'" '{gsub(/"/,q)}
NF==2&&/Host/{sub(">",":"); print $2; next}
NF>2{printf "\t%s: [" , $1;
for(i=2;i<NF;i++) printf "%s, ", $i;
printf "%s]\n", $NF}
NF==2{printf "\t%s: %s\n", $1, $2}' xml
'HOSTNAME':
Address: '10.10.10.10'
Version: 2
Community: 'STRINGHERE'
Collect: ['linux_cpu_wait_raw', 'linux_cpu_nice_raw', 'linux_cpu_kernel_raw', 'linux_mem_total', 'linux_mem_avail', 'linux_load']
但是它不了解结构,如果您的输入格式发生变化,可能会失败......
<强>解释强>
-v q="'"
为单引号设置变量,因为awk
脚本在 单引号,它需要逃避和太多的视觉噪音,这是 我更喜欢使用它。
{gsub(/"/,q)}
用单引号替换所有双引号对于两行以上的行,
NF==2&&/Host/{sub(">",":"); print $2; next}
为两行的行 字段(默认字段分隔符是空格)和匹配模式 主持人用>
替换:
符号并打印第二个字段并移至 下一行
NF>2{printf "\t%s: [" ...
字段以方括号形式打印字段
NF==2{printf ...
对于仅包含两个字段的其他行,请在中打印name: value
表格
答案 1 :(得分:0)
以下是sed
的另一个实现。
#removed closed tag
\#</.*#d
#removed open tag
s/<[a-zA-Z]\+ //
#append colon to open tag line
s/>/:/
#append colon to other lines
s/^\(.*[a-zA-Z]\+\)\(\s.*\)$/\1:\2/
#quote with brackets
s/\("[^"]\+"\($\|\s\)\)\{2,\}/\[&\]/
#replace double quote with single quote
s/"/'/g
#add comma seperated
s/'\s/', /g
将上面的sed语法保存为file.sed
,并以
$ sed -f file.sed file.txt
或使用单行命令
$ sed -e '\#</.*#d' -e 's/<[a-zA-Z]\+ //' -e 's/>/:/' -e 's/^\(.*[a-zA-Z]\+\)\(\s.*\)$/\1:\2/' -e 's/\("[^"]\+"\($\|\s\)\)\{2,\}/\[&\]/' -e "s/\"/'/g" -e "s/'\\s/', /g" file.txt
如果您的文件格式发生了变化,则可能无效。示例输出是
$ sed -f file.sed file.txt
'HOSTNAME':
Address: '10.10.10.10'
Version: 2
Community: 'STRINGHERE'
Collect: ['linux_cpu_wait_raw', 'linux_cpu_nice_raw', 'linux_cpu_kernel_raw', 'linux_mem_total', 'linux_mem_avail', 'linux_load']