заменить пробел запятой в определенной части строки

Я применил решение с сайта superuser.com. Мне помогло

Все кредиты Алексею Дегтяреву

Спасибо сетевой команде Hetzner за то, что они указали на решение, но я пошел в неправильном направлении, пытаясь создать второй xenbr в той же сети и назначить ему VIF. Но это не работает, потому что после перезапуска виртуальной машины номер VIF восстанавливается.

В Hetzner у вас есть два типа дополнительных IP-адресов -, которые вы можете использовать с выделенным сервером :одиночный IPv4 и подсеть IPv4. Для каждого отдельного IP-адреса вы получаете MAC-адрес -, и вы должны использовать этот MAC-адрес на сетевом интерфейсе нового экземпляра виртуальной машины. Для каждой дополнительной подсети необходимо настроить новую сеть и настроить маршрутизацию между этой сетью и сетью по умолчанию (, связанной с eth0 )сервера.

В XenServer это можно сделать с помощью консоли Linux:

xe network-create name-label="Additional network" name-description="46.xx.yy.zz/28"

Совет 1 :Мост xapi0 не отображался на хосте, пока я не назначил одну из виртуальных машин новой сети в Xen Center. Просто совет, который может сэкономить время, если это случится с кем-то еще.

Это создаст новую сеть, подключенную к новому мосту (xapi0 по умолчанию )в XenServer. Затем назначьте этому мосту:

первый пригодный для использования IP-адрес -сети (в соответствии с его сетевой маской ).

ip addr add 46.xx.yy.1/28 dev xapi0

Теперь вы можете добавлять новые виртуальные машины с автоматически сгенерированными MAC-адресами, подключенными к вновь созданной сети вместо сети по умолчанию. Трафик будет коммутироваться и маршрутизироваться внутри XenServer.

После такой настройки я получил подтверждение от сетевой команды Hetzner, что на коммутаторном порту видны только разрешенные MAC-адреса.

Подсказка 2. :Вы можете убедиться, что на eth0 больше нет вредоносного трафика с вашей стороны на хосте:

tcpdump -i eth0 -en|egrep -i 'mac1|mac2'

Вместо этого все должно отображаться на xapi0

tcpdump -i xapi0 -en|egrep -i 'mac1|mac2'

Где mac1,mac2 -MAC-адреса, указанные Hetzner как запрещенные.

0
08.02.2020, 13:49
1 ответ

В идеале вы должны изменить запрос к базе данных, чтобы выводить данные в нужном вам формате.

$ awk -v OFS=',' '{ $1 = $1; print }' file
1,KALI,REGISTERED
2,KALI,PROCESSING
3,KALI,RECEIVED
1,KALI,SUBMITTED
7,KALI,SUCCEEDED
4,WEKA,PROCESSING

При этом используется awkдля переформатирования данных, разделенных пробелом -или -вкладкой -в виде запятой -. Установив OFSв качестве разделителя выходных полей запятую, а затем изменив значение поля в каждой входной записи, awkвоссоздаст запись с новым выходным разделителем. Печать даст желаемый результат.

awkтакже игнорирует любые начальные или конечные пробелы в каждой строке при их чтении по умолчанию.

Если вы хотите сделать это с sed, то сначала удалите все начальные пробелы, а затем замените первый оставшийся пробел на запятую:

$ sed -e 's/^[[:blank:]]*//' -e 's/[[:blank:]]/,/' file
1,KALI,REGISTERED
2,KALI,PROCESSING
3,KALI,RECEIVED
1,KALI,SUBMITTED
7,KALI,SUCCEEDED
4,WEKA,PROCESSING

Шаблон [[:blank:]]соответствует пробелу или табуляции (точно так же, как \sв регулярных выражениях Perl ). Я использую его по привычке, но вместо этого вы можете использовать один литеральный пробел, если вы на самом деле не имеете дело с вкладками (это неясно в вопросе ). Вы также можете написать два выражения sedв одном аргументе:

sed 's/^ *//; s/ /,/' file
3
28.04.2021, 23:24

Теги

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