从文件到ldif脚本,属性用逗号分隔

时间:2017-11-16 19:38:27

标签: bash awk ldif

我有一个这样的文件:

  

h3fah055,NG_SYS_UX,NG_SYS_FO,NG_SYS_STG,NG_APP_DWH   h3fah058,NG_SYS_UX,NG_SYS_FO,NG_SYS_STG,NG_APP_DWH   h3fah065,NG_SYS_UX,NG_SYS_FO,NG_SYS_STG,NG_APP_ERP   h3fah066,NG_SYS_UX,NG_SYS_FO,NG_SYS_STG,NG_APP_ERP   h3fah082,NG_SYS_UX,NG_SYS_FO,NG_SYS_STG   h3fal029,NG_SYS_UX,NG_SYS_FO,NG_SYS_STG   h3fal030,NG_SYS_UX,NG_SYS_FO,NG_SYS_STG

我想从这个文件生成一个ldif,所以对于我需要生成的每一行:

 dn: cn=h3fah055,ou=hosts,dc=example,dc=com
 objectClass: host
 objectClass: ipHost
 objectClass: top
 ipHostNumber: 1.1.1.1
 cn: h3fah055
 Allowednetgroup: NG_SYS_UX
 Allowednetgroup: NG_SYS_FO
 Allowednetgroup: NG_SYS_STG
 Allowednetgroup: NG_APP_DWH

如何读取此文件中的每一行并保存(如果存在)变量中的每个网络组以便在文件中打印所需的输出?

我尝试了

while read p; do
  echo $p |  awk -F , '{print "dn: cn=" $1 ",ou=hosts,dc=example,dc=com"}'
done <hosts_list.txt

但我不确定如何添加文件中定义的Allowednetgroup。{/ p>

2 个答案:

答案 0 :(得分:1)

这是您可以关注的模板

awk -F, '{print "cn:",$1; 
          for(i=2;i<=NF;i++) print "Allowednetgroup:",$i}'

将处理

cn: h3fah055
Allowednetgroup: NG_SYS_UX
Allowednetgroup: NG_SYS_FO
Allowednetgroup: NG_SYS_STG
Allowednetgroup: NG_APP_DWH

你可以自己添加顶部。

答案 1 :(得分:1)

awk有一个变量NF,它是该行上的字段数。 所以你可以用这样的for语句循环遍历它们。

awk -F',' '{print "dn: cn=" $1 ",ou=hosts,dc=example,dc=com\nobjectClass:host\nobjectclass: ipHost\nobjectClass: top\nipHostNumber 1.1.1.1\ncn:" $1;
    for(i=2;i<=NF;i++) print "Allowednetgroup: " $i  }' hosts_list.txt

请注意,awk会读取每一行本身,因此您不需要像MVCE那样一次传递一行。只需将文件名作为第二个参数传递。 即awk '<script>' filename

上面的脚本将产生如下输出:

dn: cn=h3fah055,ou=hosts,dc=example,dc=com
objectClass:host
objectclass: ipHost
objectClass: top
ipHostNumber 1.1.1.1
cn:h3fah055
Allowednetgroup: NG_SYS_UX
Allowednetgroup: NG_SYS_FO
Allowednetgroup: NG_SYS_STG
Allowednetgroup: NG_APP_DWH
etc...