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.awkawk 파일을 사용하세요

답변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

관련 정보