Из файла в сценарий 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, сколько определено в файле.


person LucaP    schedule 16.11.2017    source источник


Ответы (2)


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...
person Niall Cosgrove    schedule 16.11.2017

это шаблон, которому вы можете следовать

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

Вы можете добавить вершину самостоятельно.

person karakfa    schedule 16.11.2017