Или, что то же самое, ни с awk
, ни с cut
, но сsed
:
$ sed '=' file \
| sed 'N;s/\n/</' \
| sort -t"<" -u -k2,2 \
| sort -t"<" -k1,1 \
| sed 's/^[0-9]*<//'
aaa<vvv>bbb<vvv>ccc
xxx<vvv>yyy<vvv>zzz
111<vvv>222<vvv>333
Но это очень неуклюже. Последнее (решение @Kusalananda на основе awk -)намного лучше.
Только ради педагогики два первых блока sed
выше эквивалентны более компактному awk
cmd:
sed '=' file
, печатает номера строк для последующего заказа sed 'N;s/\n/</'
, добавляет следующую строку ввода в пространство шаблонов (, то есть «соединяет текущую и следующую строки» )и заменяет конец -строки -\n
на <
. 3-й и последний sed
лакомый кусочек, sed 's/^[0-9]*<//'
, заменяет номер строки и «<», поставленные ранее в начале каждой строки, ничем.
Для получения дополнительных сведений о sed
введите $ info sed
в консоли.
Ssh передает только переменную среды TERM
через (+ LANG
и LC_*
во многих конфигурациях по умолчанию ^1). Изменение конфигурации сервера для принятия любых переменных среды может иметь серьезные последствия (, позволяя пользователю обходить свою оболочку входа в систему и любыеForceCommand
)и вы не должны этого делать .
Вместо того, чтобы пытаться передать их через ssh, вы можете установить их справа, как часть аргумента «удаленная команда» (s )и явно запустить интерактивную оболочку входа в систему:
ssh -t user@host AAA=tatata bash -l
Опция -t
позволяет ssh
выделить псевдо-терминал -, чего он не будет делать по умолчанию, когда указана удаленная команда. Параметр -l
bash — позволить запустить оболочку входа в систему, т.е.чтобы позволить ему исходить ~/.bash_login
и максимально точно имитировать способ его запуска, когда для ssh не указаны аргументы удаленной команды.
Поскольку значения переменных окружения будут расширены дважды, как на локальной, так и на удаленной стороне, вам следует заключить их в двойные кавычки, что может быстро стать неприятным:
ssh -t user@host PRICE=\\\$19 bash -l
Но если ваша конфигурация позволяет использовать LC_*
envvars, вы можете просто назвать свои переменные таким образом ;-)
LC_AAA=tatata ssh user@host
или, если конфигурация вашего ssh клиента не включает LC_*
вSendEnv
:
LC_AAA=tatata ssh -o SendEnv=LC_AAA user@host
^1 Чтобы иметь возможность передавать дополнительные envvars через ssh, необходимы как AcceptEnv
на сервере, так и SendEnv
на клиенте. Найдите эти директивы в ssh*_config
, чтобы узнать, каковы их значения по умолчанию в вашей системе (s ).