извлекать данные из файла и манипулировать содержимым для записи в новый файл

Вы можете ознакомиться с любым из нескольких онлайн-руководств по этой теме.

В основном вы обычно активируете TLS, а затем добавляете правило авторизации, для которого потребуется сертификат клиента:

SSLVerifyClient require

Это приведет к сбою доступа, и браузер попросит клиента выбрать один из доступных сертификатов, которые должны быть уже установлены в клиентской операционной системе или браузере . Как только выбранный сертификат будет загружен в клиент, он будет автоматически отправлен на сервер.

Теперь добавление также SSLOptions +StdEnvVarsукажет Apache извлечь информацию из сертификата, что позволит вам различать пользователей.

Теперь у вас есть эта ценная информация в среде, и вы можете использовать ее для дальнейшей аутентификации либо в приложении, либо в Apache.

Переменные окружения, которые вам нужны, вероятно, SSL_CLIENT_S_<something>. SSL_CLIENT_S_DN_CN— общее имя в сертификате клиента. Затем вы можете ограничить параметры клиентов, как хотите:

SSLRequireSSL
SSLOptions  +StdEnvVars +ExportCertData +OptRenegotiate +FakeBasicAuth
SSLVerifyClient   require
SSLRequire %{SSL_CLIENT_I_DN_CN} eq "Issuer DN's Common Name"
       and %{SSL_CLIENT_S_DN_O}  eq "Subject DN's Organisation"
       and %{SSL_CLIENT_S_DN_CN} eq "Leonardo Serni"

Обратите внимание, что, как правильно указал @UlrichSchwarz, вы должны принудительно использовать центр сертификации . В противном случае любой мог бы сам -подписать сертификат, подтверждающий что угодно , и вам было бы все равно.

Таким образом, вам следует создать собственный ЦС и использовать этот для создания подписанных сертификатов, которые затем будут распространяться среди ваших клиентов.

UPDATE:I переменные относятся к (I )ssuer, а S относятся к (S )субъекту, что то есть тот, кто выполняет аутентификацию (, то есть ваш клиент ). Вы можете найти полный список и их значение в документации по mod_ssl.

2
24.12.2020, 16:10
3 ответа

С GNUawk:

awk -F, '!seen[$3 FS $9 FS $7]++ {
    cmd="echo \047" $9 "\047 | rev | tr ATCG TAGC";
    if ((cmd |getline $9)>0){ print $3, $9, $7; };
    close(cmd);
}' OFS=, infile

Выход:

188823,TGGTACAG,ACTCTCGA
189843,TGTACAAG,ACCCTGGA

добавьте NR>2к команде типа awk 'NR>2{...; }', чтобы пропустить первые две строки из ввода.

Здесь мы использовали [getlineв переменную из конвейера ] с предопределенной командой вcmd="..." $9 "..."(обратите внимание, что мы заключаем в двойные -кавычки )только те элементы, которые относятся к внешней команде ), затем вызываем из Pipe в getlineи сохранить результат в том же поле $9; затем мы печатали нужные поля в выводе, если результат getlineбыл успешным.

Наконец, мы должны закрыть(cmd)команду , которую мы открыли.

!seen[$3 FS $9 FS $7]++используется для игнорирования обработки повторяющихся строк в полях #3, #9 и #7.

5
18.03.2021, 22:41
$ cat tst.awk
BEGIN {
    FS=OFS=","
    map["A"] = "T"
    map["C"] = "G"
    map["G"] = "C"
    map["T"] = "A"
}
{
    str = ""
    for (i=1; i<=length($9); i++) {
        str = map[substr($9,i,1)] str
    }
    print $3, str, $7
}

$ awk -f tst.awk content.csv
188823,TGGTACAG,ACTCTCGA
189843,TGTACAAG,ACCCTGGA

или если вы хотите иметь функции типа trи revв awk:

$ cat tst.awk
BEGIN { FS=OFS="," }
{ print $3, rev(tr($9,"ACGT","TGCA")), $7 }

function tr(oldStr,oldChars,newChars,   i,pos,oldChar,newStr) {
    for (i=1; i<=length(oldStr); i++) {
        oldChar = substr(oldStr,i,1)
        pos     = index(oldChars,oldChar)
        newStr  = newStr (pos ? substr(newChars,pos,1) : oldChar)
    }
    return newStr
}

function rev(oldStr,    i,newStr) {
    for (i=1; i<=length(oldStr); i++) {
        newStr = substr(oldStr,i,1) newStr
    }
    return newStr
}

$ awk -f tst.awk content.csv
188823,TGGTACAG,ACTCTCGA
189843,TGTACAAG,ACCCTGGA

или только одна функция, которая делает и то, и другое:

$ cat tst.awk
BEGIN { FS=OFS="," }
{ print $3, trev($9,"ACGT","TGCA"), $7 }

function trev(oldStr,oldChars,newChars, i,pos,oldChar,newStr) {
    for (i=1; i<=length(oldStr); i++) {
        oldChar = substr(oldStr,i,1)
        pos     = index(oldChars,oldChar)
        newStr  = (pos ? substr(newChars,pos,1) : oldChar) newStr
    }
    return newStr
}

$ awk -f tst.awk content.csv
188823,TGGTACAG,ACTCTCGA
189843,TGTACAAG,ACCCTGGA
3
18.03.2021, 22:41

Для этого можно использовать perl.

  • разделять строки по запятой и сохранять поля в массиве с нулевым индексом@F:
  • установить разделитель списка $,и соединитель списка $"на запятую.
  • поменять местами символы 9-го элемента $F[8]и затем применить перевод символов.
$ perl -F, -lane '
    BEGIN { $, = $" = ","; }
    print $F[2], reverse($F[8]) =~ tr/ATGC/TACG/r, $F[6]
      if $. > 2 && !$h{"@F[2,6,8]"}++;
' file
188823,TGGTACAG,ACTCTCGA
189843,TGTACAAG,ACCCTGGA
1
18.03.2021, 22:41

Теги

Похожие вопросы