Мы можем рассматривать строку ввода как несколько записей, каждая из которых разделена двумя или более пробелами. Каждая запись может быть разделена на два поля на основе двоеточий и любого одиночного пробела после него. Нам нужно второе поле в каждой такой записи.
С GNUawk
(или mawk
, но не nawk
, который не любит регулярные выражения в качестве разделителей записей):
$ awk -vRS=" *|\n" -vFS=": ?" -vORS=" " '{ print $2 } END { printf("\n") }' data.in
44.75TB 0.44TB 42.04TB 6.07%
RS=" *|\n"
устанавливает в качестве разделителя записей два или более пробела или новую строку. Это разбивает Total: 44.75TB Used: 0.44TB
на две записи: Total: 44.75TB
и Used: 0.44TB
. FS=": ?"
устанавливает в качестве разделителя полей двоеточие, за которым может следовать пробел. Это разбивает Used: 0.44TB
на два поля: Used
и 0.44TB
. ORS=" "
устанавливает разделитель записей вывода на пробел. Код awk
просто печатает второе поле каждой записи, разделенное символом ORS
, и заканчивает выводом новой строки.
Если вы хотите удалить из этого все, что не является числом, просто пропустите его черезtr -dc '0-9. \n'
:
$ awk -vRS=" *|\n" -vFS=": ?" -vORS=" " '{ print $2 } END { printf("\n") }' data.in | tr -dc '0-9. \n'
44.75 0.44 42.04 6.07
tr -dc '0-9. \n'
удалит все, что не является цифрой, точкой, пробелом или новой строкой.
My problem is that the way the command is written the change of directory happens before the ~./bashrc is even executed
Более вероятно, что ~/.bashrc
вообще не читается. Bash читает ~/.bashrc
, только если он вызывается как интерактивная(не -логин )оболочка. Когда вы даете команду для запуска в командной строке ssh
, она выполняет оболочку с параметром -c
, что делает ее не -интерактивной.
Но это можно обойти, найдя .bashrc
вручную:
ssh -t user@server '. ~/.bashrc; cd dir; exec bash'
Некоторые bashrc
файлы проверяют, является ли оболочка интерактивной, и вносят изменения только в том случае, если это так.(Это звучит ненужно, так как bashrc
читается только из интерактивной оболочки, но из-за того, как работают файлы запуска Bash, bashrc
также часто берется из .bash_profile
или его эквивалента.)
Чтобы обойти это, вам нужно принудительно вызвать интерактивный вызов Bash, например:
ssh -t user@server 'bash -ic "cd /tmp; exec bash"'
В ручном поиске .bashrc
теперь нет необходимости, поскольку -i
Bash делает это сам. Второй второй Bash (изexec bash
)также делает это, поэтому, если это проблема, замените последнюю часть на exec bash --norc
.
...
Вероятно, было бы неплохо разделить соответствующую настройку в другой файл (, скажем,.thingy.rc
).Затем источник этого из .bashrc
(, если необходимо )и из команды SSH вместо .bashrc
.