конвертировать 1 поле awk в base64 и оставить остальные нетронутыми - PullRequest
0 голосов
/ 10 октября 2019

Я создаю один лайнер, где мой экспорт ldap напрямую преобразуется в csv. Пока все хорошо, но проблема в том, что 1 столбец моего csv должен содержать закодированные в base64 значения. Эти значения выводятся в виде открытого текста из фильтра поиска ldap. Поэтому мне нужно, чтобы они были конвертированы во время создания awk.

То, что у меня есть:

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

Это дает мне вывод в формате csv, как и предполагалось, но теперь мне нужно преобразовать BLOB-объекты в кодированный base64 вывод. .

Getline недоступен

демонстрационный ввод:

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

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

Выход должен быть как

1313131313,D121,YSBzdHJpbmcgd2l0aCBzcGFjZXM=

где YSBzdHJpbmcgd2l0aCBzcGFjZXM = это закодированная строка с пробелами

но теперь я получаю

1313131313,D121,a string with spaces

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Как то так, может быть?

$ 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
2 голосов
/ 10 октября 2019

Если вы не можете использовать getline и вам просто нужно вывести csv (вы не можете далее обрабатывать поле base64'd), измените порядок полей в выходных данных и используйте новую строку system,Сначала немного измененные входные данные (измененный порядок, пропущенное поле):

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

И вывод:

1313131313,d121,YSBzdHJpbmcgd2l0aCBzcGFjZXMK
131313asdf1313,d122,YW4gb3RoZXIgc3RyaW5nIHdpdGggc3BhY2VzCg==
131313asdf1313,d122,Cg==
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...