我有一个包含以下格式的 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
程序的第一个命令。)