Yannick De Backer
Yannick De Backer

Reputation: 105

convert 1 field of awk to base64 and leave the rest intact

I'm creating a one liner where my ldap export is directly converted into a csv. So far so good but the challange is now that 1 column of my csv needs to contain base64 encoded values. These values are comming as clear text out of the ldap search filter. So I basically need them converted during the awk creation.

What I have is:

ldapsearch | awk -v OFS=',' '{split($0,a,": ")}  /^blobinfo:/{blob=a[2]} /^cn:/{serialnr=a[2]} {^mode=a[2]; print serialnr, mode, blob}'

This gives me a csv output as intended but now I need to convert blob to base64 encoded output.

Getline is not available

demo input:

cn: 1313131313
blobinfo: a string with spaces
mode: d121

cn: 131313asdf1313
blobinfo: an other string with spaces
mode: d122

ouput must be like

1313131313,D121,YSBzdHJpbmcgd2l0aCBzcGFjZXM=

where YSBzdHJpbmcgd2l0aCBzcGFjZXM= is the encoded a string with spaces

but now I get

1313131313,D121,a string with spaces

Upvotes: 0

Views: 548

Answers (2)

James Brown
James Brown

Reputation: 37464

If you can't use getline and you just need to output the csv (you can't further process the base64'd field), change the order of fields in output and abuse the system's newline. First, a bit modified input data (changed order, missing field):

cn: 1313131313
blobinfo: a string with spaces
mode: d121

blobinfo: an other string with spaces
mode: d122
cn: 131313asdf1313

cn: 131313asdf1313
mode: d122

The awk:

$ awk '
BEGIN {
    RS=""                            # read in a block of rows
    FS="\n"                          # newline is the FS
    h["cn"]=1                        # each key has a fixed buffer slot
    h["blobinfo"]=2
    h["mode"]=3
}
{
    for(i=1;i<=NF;i++) {             # for all fields
        split($i,a,": ")             # split to a array
        b[h[a[1]]]=a[2]              # store to b uffer
    }
    printf "%s,%s,",b[1],b[3]        # output all but blob, no newline
    system("echo " b[2] "| base64")  # let system output the newline
    delete b                         # buffer needs to be reset
}' file                              # well, I used file for testing, you can pipe

ANd the output:

1313131313,d121,YSBzdHJpbmcgd2l0aCBzcGFjZXMK
131313asdf1313,d122,YW4gb3RoZXIgc3RyaW5nIHdpdGggc3BhY2VzCg==
131313asdf1313,d122,Cg==

Upvotes: 2

Shawn
Shawn

Reputation: 52579

Something like this, maybe?

$ perl -MMIME::Base64 -lne '
   BEGIN { $, = "," }
   if (/^cn: (.+)/) { $s = $1 }
   if (/^blobinfo: (.+)/) { $b = encode_base64($1, "") }
   if (/^mode: (.+)/) { print $s, $1, $b }' input.txt
1313131313,d121,YSBzdHJpbmcgd2l0aCBzcGFjZXM=
131313asdf1313,d122,YW4gb3RoZXIgc3RyaW5nIHdpdGggc3BhY2Vz

Upvotes: 3

Related Questions