user1
, скажем, /home/user1/key1
и /home/user1/key2
. Если у вас нет особенно серьезных проблем с безопасностью, вы можете дать пустой пароль одному из них, скажем, key1
. Скопируйте оба ключа на сервер с помощью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
На сервере отредактируйте свой ~user2/.ssh/authorized_keys
и добавьте command="bzr..."
к первому ключу.
Вернувшись на клиентскую машину, отредактируйте файл ~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
Теперь используйте bzr+ssh://alias1
для bazaar
и ssh alias2
для входа в систему.
Далее отредактируйте ~/.ssh/config
в соответствии с вашими потребностями, синтаксис тот же, что и для /etc/ssh/ssh_config
. Вот и все.
$ 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
— это наша собственная переменная, для которой задано «правильное количество полей» из первой строки.
Вы можете просто исправить текст с помощью регулярного выражения:
<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"
Короткий 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"
Другое 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"