ldapsearchコマンドから詳細を取得し、以下のようにファイルを生成するファイルがあります。
# lschuler, people, pl.s2-eu.XXXXXXXXX.local
dn: uid=lschuler,ou=people,dc=pl,dc=s2-eu,dc=XXXXXXXXX,dc=local
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
homeDirectory: /home/lschuler
gidNumber: 10000
uid: lschuler
cn: Leonie Schuessler
uidNumber: 20056
mail: [email protected]
sn: Schuessler
givenName: Leonie
# cadelie, people, pl.s2-eu.XXXXXXXXX.local
dn: uid=cadelie,ou=people,dc=pl,dc=s2-eu,dc=XXXXXXXXX,dc=local
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
homeDirectory: /home/cadelie
gidNumber: 10000
uid: cadelie
cn:: Q2hsb8OpIEFkw6lsaWU=
uidNumber: 20057
mail: [email protected]
sn:: QWTDqWxpZQ==
givenName:: Q2hsb8Op
見たら電話番号::&名前::時々base64の値があり、コマンドを使用してデコードしたいができません。
cat file.text | sed -e "s/.*sn:: //g;s/;.*//" |base64 -d && cat file.text | sed -e "s/.*givenName:: //g;s/;.*//" |base64 -d
sn:: と指定された名前:: のみ base64 値にデコードし、同じファイルに再保存するにはどうすればよいですか?
助けてくださいサムライ
答え1
awkを使用してください。
$ cat tst.awk
/^(sn|givenName):: */ {
tag = val = $0
sub(/ .*/,"",tag)
sub(/^[^ ]+ */,"",val)
cmd = "printf \047%s\047 \047" val "\047 | base64 -d"
if ( (cmd | getline line) > 0 ) {
$0 = tag " " line
}
close(cmd)
}
{ print }
$ awk -f tst.awk file
# lschuler, people, pl.s2-eu.XXXXXXXXX.local
dn: uid=lschuler,ou=people,dc=pl,dc=s2-eu,dc=XXXXXXXXX,dc=local
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
homeDirectory: /home/lschuler
gidNumber: 10000
uid: lschuler
cn: Leonie Schuessler
uidNumber: 20056
mail: [email protected]
sn: Schuessler
givenName: Leonie
# cadelie, people, pl.s2-eu.XXXXXXXXX.local
dn: uid=cadelie,ou=people,dc=pl,dc=s2-eu,dc=XXXXXXXXX,dc=local
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
homeDirectory: /home/cadelie
gidNumber: 10000
uid: cadelie
cn:: Q2hsb8OpIEFkw6lsaWU=
uidNumber: 20057
mail: [email protected]
sn:: Adélie
givenName:: Chloé
各呼び出しごとにサブシェルを分離するため、そのbase64
部分が遅くなります。
答え2
Perlとそのツールを使ってMIME::Base64モジュールでは、次のパッドはフィールド名が2つのコロン(::)で終わる各行のデータをbase64にデコードします。他の行は変更されません。
MIME::Base64
v5.8(2002年7月)以降、Perlに含まれるコアPerlモジュールです。
$ perl -MMIME::Base64 -pe 's/^((?:[^:]*)):: *(.*)/"$1: " . decode_base64($2)/e' file.txt
# lschuler, people, pl.s2-eu.XXXXXXXXX.local
dn: uid=lschuler,ou=people,dc=pl,dc=s2-eu,dc=XXXXXXXXX,dc=local
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
homeDirectory: /home/lschuler
gidNumber: 10000
uid: lschuler
cn: Leonie Schuessler
uidNumber: 20056
mail: [email protected]
sn: Schuessler
givenName: Leonie
# cadelie, people, pl.s2-eu.XXXXXXXXX.local
dn: uid=cadelie,ou=people,dc=pl,dc=s2-eu,dc=XXXXXXXXX,dc=local
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
homeDirectory: /home/cadelie
gidNumber: 10000
uid: cadelie
cn: Chloé Adélie
uidNumber: 20057
mail: [email protected]
sn: Adélie
givenName: Chloé
これは標準出力として印刷されます。入力ファイルを変更するには、Perlの-i
内部編集オプションを使用できます。