modifica o arquivo usando o awk ou o sed

0

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  
    
por Sahni 15.04.2015 / 11:57

3 respostas

2

Uma alternativa genérica de awk :

awk '
    /^uid:/ {
        uid=$2
    }
    /^homeDirectory:/ {
        if ($NF !~ uid"$") { $NF = $NF"/"uid }
    }
    { print }
    ' text.file
    
por 15.04.2015 / 12:43
0

arquivo awk:

$1=="uid" { uid=substr($2,2) ; }
$1=="homeDirectory" { printf "%s: /home/myworker/2013/%s\n",$1,uid ; next ;}
{ print ;} 

que

  • basicamente lembre-se de uid
  • imprima um diretório inicial fixo, com base no ano fixo e no último uid.

para ser chamado com

awk -F: -f tmp.awk < yourinputfile

onde

  • -F: use: como separador
  • -f tmp.awk usa o arquivo awk
por 15.04.2015 / 12:37
0

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 .)

    
por 15.04.2015 / 12:43

Tags