使用 awk 或 sed 修改文件

使用 awk 或 sed 修改文件

我有一个包含以下格式的 ldap 数据的文本文件,我们的默认结构表示每个用户必须有自己各自的“主目录”,但在下面的给出中我发现许多用户具有相同的主目录,即“homeDirectory:/ home /UGstudent/2013”​​所以我想将其更改为“homeDirectory:/home/UGstudent/2013/xyz”意味着我需要采用与每个用户的“uid:abc”字段中相同的名称并将其附加到“homeDirectory: “ 场地。

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  

答案1

一个通用的awk替代方案:

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

答案2

awk 文件:

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

哪个

  • 基本上记住uid
  • 根据固定年份和最后一个 uid 打印固定的主目录。

被称为与

awk -F: -f tmp.awk < yourinputfile

在哪里

  • -F:用途:作为分隔符
  • -f tmp.awk使用 awk 文件

答案3

awk版本将保持已将用户 ID 作为 homeDirectory 一部分的条目完整无缺:

awk -F ": *" '
    $1=="uid" { uid = $2 }
    $1=="homeDirectory" && $2=="/home/myworker/2013" { $0=$0"/"uid }
    { print }
' infile > outfile

(注意:您的数据不应有尾随空格。要清理它,您可以添加一个命令{ gsub(/ +$/, "", $2 }作为awk程序的第一个命令。)

相关内容