使用bash脚本构建列表

时间:2016-04-13 14:13:42

标签: bash yaml

我是打击脚本的新手,我正在寻找解释开发脚本时思考过程的答案。

我在配置文件中有一个主机列表,但需要将其转换为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']

我很难找到一个例子去做我想要达到的目标。

谢谢,

我欣赏任何方向。

2 个答案:

答案 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']