다음 형식의 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
버전에서는 homeDirectory의 일부로 사용자 ID가 있는 항목을 그대로 유지합니다.
awk -F ": *" '
$1=="uid" { uid = $2 }
$1=="homeDirectory" && $2=="/home/myworker/2013" { $0=$0"/"uid }
{ print }
' infile > outfile
(참고: 데이터 뒤에 공백이 있어서는 안 됩니다. 이를 정리하려면 프로그램의 첫 번째 명령 { gsub(/ +$/, "", $2 }
으로 명령을 추가할 수 있습니다.)awk