Uma alternativa genérica de awk
:
awk '
/^uid:/ {
uid=$2
}
/^homeDirectory:/ {
if ($NF !~ uid"$") { $NF = $NF"/"uid }
}
{ print }
' text.file
Eu tenho um arquivo de texto contém dados ldap no dar abaixo formato, nossa estrutura padrão diz que cada usuário deve ter seu próprio "diretório base", mas em dado abaixo eu encontrei muitos usuários têm o mesmo diretório home e que é "homeDirectory : / home / UGstudent / 2013 "então eu quero mudar para" homeDirectory: / home / UGstudent / 2013 / xyz "significa que eu preciso ter o mesmo nome que no campo" uid: abc "de cada usuário e anexá-lo a "homeDirectory:" campo.
dn: uid=abc,ou=People,dc=abc,dc=com
uid: abc
cn: abc def
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowLastChange: 15923
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 10000
gidNumber: 9000
homeDirectory: /home/myworker/2013/abc
gecos:: QWpheSBLasdfkshdfksdkfhUJTTVMxMywJU1RVLA==
structuralObjectClass: account
entryUUID: 74dec3aa-0fb6-4d86sfs-962e-432ea83c75e0
creatorsName: cn=Manager,dc=abc,dc=com
createTimestamp: 20160806091411Z
userPassword:: e1NIQXKSJFkHkjhfskDAvS2NwYWxXcm4zY2JEL2wxYVk9
entryCSN: 20160121043505.309136Z#000000#000#000000
modifiersName: uid=abc,ou=People,dc=abc,dc=com
modifyTimestamp: 20160121043505Z
dn: uid=xyz,ou=People,dc=abc,dc=com
uid: xyz
cn: xyz jakas
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowLastChange: 15923
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1260
gidNumber: 9000
homeDirectory: /home/myworker/2013
gecos:: QWtzaGFqIFByZfdsfdsfdsgDAzLAlCU01TMTMsCVNUVSw=
structuralObjectClass: account
entryUUID: 81fc5c44-6d63-4d4a-bb74-7ae5f12bbeef
creatorsName: cn=Manager,dc=abc,dc=com
createTimestamp: 20160806091411Z
userPassword:: e1NIQXkjfshgjdsJMQTB2SsdfSGFMekpZSkV1ZkZsWlE9
entryCSN: 20150118182228.898901Z#000000#000#000000
modifiersName: uid=xyz,ou=People,dc=abc,dc=com
modifyTimestamp: 20160118182228Z
arquivo awk:
$1=="uid" { uid=substr($2,2) ; }
$1=="homeDirectory" { printf "%s: /home/myworker/2013/%s\n",$1,uid ; next ;}
{ print ;}
que
para ser chamado com
awk -F: -f tmp.awk < yourinputfile
onde
-F:
use: como separador -f tmp.awk
usa o arquivo awk Esta versão awk
manterá entradas intactas que já tenham um ID de usuário como parte do homeDirectory:
awk -F ": *" '
$1=="uid" { uid = $2 }
$1=="homeDirectory" && $2=="/home/myworker/2013" { $0=$0"/"uid }
{ print }
' infile > outfile
(Nota: seus dados não devem ter espaços à direita. Para limpar isso, você também pode adicionar um comando { gsub(/ +$/, "", $2 }
como o primeiro comando do programa awk
.)