从文件到 ldif 脚本,属性用逗号分隔
From file to ldif script, attributes separated by comma
我有这样一个文件:
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=" ",ou=hosts,dc=example,dc=com"}'
done <hosts_list.txt
但我不确定如何添加文件中定义的数量 Allowednetgroup
。
这是您可以遵循的模板
awk -F, '{print "cn:",;
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
可以自己加顶
awk 有一个变量NF
,它是行中的字段数。
所以你可以用这样的 for
语句遍历它们。
awk -F',' '{print "dn: cn=" ",ou=hosts,dc=example,dc=com\nobjectClass:host\nobjectclass: ipHost\nobjectClass: top\nipHostNumber 1.1.1.1\ncn:" ;
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...
我有这样一个文件:
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=" ",ou=hosts,dc=example,dc=com"}'
done <hosts_list.txt
但我不确定如何添加文件中定义的数量 Allowednetgroup
。
这是您可以遵循的模板
awk -F, '{print "cn:",;
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
可以自己加顶
awk 有一个变量NF
,它是行中的字段数。
所以你可以用这样的 for
语句遍历它们。
awk -F',' '{print "dn: cn=" ",ou=hosts,dc=example,dc=com\nobjectClass:host\nobjectclass: ipHost\nobjectClass: top\nipHostNumber 1.1.1.1\ncn:" ;
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...