Сценарий Awk для проверки каждой строки в файле

  1. На клиентской машине сгенерируйте два ключа для user1, скажем, /home/user1/key1и /home/user1/key2. Если у вас нет особенно серьезных проблем с безопасностью, вы можете дать пустой пароль одному из них, скажем, key1.
  2. Скопируйте оба ключа на сервер с помощьюssh-copy-id:

    ssh-copy-id -i ~/.ssh/key1 user2@server.example.com
    ssh-copy-id -i ~/.ssh/key2 user2@server.example.com
    

    Войдите с ними обоими, чтобы убедиться, что они работают:

    ssh -i ~/.ssh/key1 user2@server.example.com
    ssh -i ~/.ssh/key2 user2@server.example.com
    
  3. На сервере отредактируйте свой ~user2/.ssh/authorized_keysи добавьте command="bzr..."к первому ключу.

  4. Вернувшись на клиентскую машину, отредактируйте файл ~user1/.ssh/configи добавьте псевдонимы для обоих ключей. Примерно так:

    Host alias1
        HostName        server.example.com
        User            user2
        IdentityFile    /home/user1/.ssh/key1
        ControlPath     ~/.ssh/ctl1-%u-%r-%h-%p
        ControlMaster   auto
        ControlPersist  5m
    
    Host alias2
        HostName        server.example.com
        User            user2
        IdentityFile    /home/user1/.ssh/key2
    
  5. Теперь используйте bzr+ssh://alias1для bazaarи ssh alias2для входа в систему.

Далее отредактируйте ~/.ssh/configв соответствии с вашими потребностями, синтаксис тот же, что и для /etc/ssh/ssh_config. Вот и все.

0
05.12.2019, 17:55
4 ответа
$ awk -F, 'FNR == 1 { nf = NF } { while (NF < nf || !/[^,]"$/) { line = $0; getline; $0 = line $0 }; print }' file
"100","Thomas","Sales","5000"
"200","Jason","Technology","5500"
"300","Mayla","Technology","7000"
"400","Nisha","Marketing","9500"
"500","Randy","Technology","6000"
"501","Ritu","Accounting","5400"

При этом используется awkи предполагается, что 1-я строка имеет правильное количество полей и ни одно из полей не может содержать встроенные запятые. Кроме того, предполагается, что ни в одной строке никогда не будет слишком много полей, т. е. в строке могут быть дополнительные символы новой строки, но ни одна строка не будет соединена со следующей/предыдущей строкой.

При обнаружении строки с неправильным количеством полей (или строки, которая не заканчивается символом ", что означает, что последнее поле было разделено ), текущая строка сохраняется в переменная lineи считывается следующая строка. Затем текущая строка обновляется как конкатенация lineи только что прочитанной строки. Это продолжается (в случае нескольких последовательных разделенных строк )до тех пор, пока мы не получим что-то, что имеет правильное количество полей. Затем реконструированная линия печатается.

NF— это специальная переменная awk, содержащая количество полей в текущей записи. (запись — это строка по умолчанию ). Этот номер обновляется автоматически, когда$0(назначается текущая запись )или когда считывается новая запись. Переменная nf— это наша собственная переменная, для которой задано «правильное количество полей» из первой строки.

4
28.01.2020, 02:17

Вы можете просто исправить текст с помощью регулярного выражения:

<input.csv perl -pe 's/^(.+)([^"])\n$/\1\2/g'

дает вам

"100","Thomas","Sales","5000"
"200","Jason","Technology","5500"
"300","Mayla","Technology","7000"
"400","Nisha","Marketing","9500"
"500","Randy","Technology","6000"
"501","Ritu","Accounting","5400"
0
28.01.2020, 02:17

Короткий awk-подход:

awk -F, '{ printf "%s%s", $0, $NF ~ /^$|[^"]$/? "":ORS }' file
  • $NF ~ /^$|[^"]$/-проверить, является ли последнее поле $NFпустой строкой ^$ИЛИ словом без заканчивающейся двойной кавычки[^"]$

Выход:

"100","Thomas","Sales","5000"
"200","Jason","Technology","5500"
"300","Mayla","Technology","7000"
"400","Nisha","Marketing","9500"
"500","Randy","Technology","6000"
"501","Ritu","Accounting","5400"
0
28.01.2020, 02:17

Другое awkрешение:

awk -F, 'NF==4 { print $0 }; NF!=4 { str= $0; getline; print str $0 }' employee.txt

"100","Thomas","Sales","5000"
"200","Jason","Technology","5500"
"300","Mayla","Technology","7000"
"400","Nisha","Marketing","9500"
"500","Randy","Technology","6000"
"501","Ritu","Accounting","5400"
0
28.01.2020, 02:17

Теги

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