Просмотр логов:
Tue Jun 27 21:35:47 2017 /sbin/ip addr add dev tun0 10.8.0.3/24 broadcast 10.8.0.255
RTNETLINK answers: File exists
Tue Jun 27 21:35:47 2017 ERROR: Linux route add command failed:
external program exited with error status: 2
Этот конкретный фрагмент журнала говорит о том, что вы пытаетесь создать маршрут, который уже существует(RTNETLINK answers: File exists
). Когда вы определяете IP-адреса на сервере и клиенте (или пул, который будут использовать клиенты ), маршруты, используемые для связи между этими IP-адресами, создаются по запросу на основе этой сетевой маски «LAN». Эти строки в конфигурации сервера:
server 10.8.0.0 255.255.255.0
ifconfig 10.8.0.1 10.8.0.2
Имея это в виду, вам не нужно принудительно отправлять маршрут на IP-адреса в той же сети с масками /32
или /24
. Вам просто нужно удалить или прокомментировать следующие строки в файле конфигурации вашего сервера:
push "route 10.8.0.1 255.255.255.255"
push "route 10.8.0.0 255.255.255.0"
Теперь повторяющихся маршрутов больше не будет:)
Для редактирования на месте может быть проще сделать что-то вроде
sed -i "s/\t/ /g" file.txt \
&& sed -i "s/ID=match[[:digit:]]\+;Target=//g" test.txt \
&& sed -i "s/_RDNAU_[[:digit:]]\+_[[:digit:]]\+//g" test.txt
Немного грубой силы, но чертовски проще.
Попробуйте это:
awk -v FS='\t' -v OFS='\t' '{
split($1, a, "_"); $1 = a[1]"_"a[2];
sub(/.*=/, "", $5);
print
}' input > output
Это предполагает, что наборы пробелов на самом деле являются символами табуляции в исходном файле; если это не так, вы можете избавиться от опций -v..
.
Если k1=v1;k2=v2;...
в 5-м поле может быть в любом порядке, или если Target=SF..
не может быть последним, необходимо что-то более сложное, но трудно -угадать, что именно из доступная информация.
Если вы хотите отредактировать файл «в -месте», вам следует переименовать исходный файл:
awk '...' input > tmpfile && mv tmpfile input
В перле:
#!/usr/bin/perl
use feature 'say';
while(<>) {
chomp; # strip the trailing end-of-line character(s).
my (@F) = split; # split the input line into fields
$F[0] =~ s/(^[^_]*_[^_]*)_.*/$1/; # strip everything from 2nd _ from field 1
$F[4] =~ s/^ID=[^;]*;Target=//; # strip from ID= to Target= from field 5
say join("\t",@F); # print all the fields separated by a tab.
}
Если вы хотите это как один -вкладыш:
perl -lane '$F[0] =~ s/(^[^_]*_[^_]*)_.*/$1/;
$F[4] =~ s/^ID=[^;]*;Target=//;
print join("\t",@F);' input.txt
Опция perl -l
включает автоматическую линию -завершающую обработку (chomp ). -a
включает awk -как автоматическое разбиение поля (на массив@F
). -a
также неявно включает -n
(, который автоматически создает цикл while(<>){.. }
вокруг кода Perl ), но мне нравится указывать эту опцию явно. Подробности см. в man perlrun
.
Обратите внимание, что массивы perl начинаются с 0, а не с 1.
Пример вывода (либо с одной подставки -, либо с одной -версии вкладыша):
SF_0000000555 10873 11041 + SF_0000000005 99 267 168
SF_0000000555 188079 188215 + SF_0000000020 3 138 135
SF_0000000555 137594 137704 - SF_0000000048 16 126 110
SF_0000000555 70582 71504 - SF_0000000350 8970 9886 916
SF_0000000555 100212 101204 - SF_0000000350 9584 10597 1013
SF_0000000555 101165 101747 - SF_0000000350 9005 9581 576
SF_0000000555 82434 82891 - SF_0000000350 9273 9730 457
команда
awk '{$1=substr($1,1,13);print $0}' filename| sed "s/ID.*=//g"| awk 'OFS ="\t" {print $1,$2,$3,$4,$5,$6,$7,$8}'
выход
SF_0000000555 10873 11041 + SF_0000000005 99 267 168
SF_0000000555 188079 188215 + SF_0000000020 3 138 135
SF_0000000555 137594 137704 - SF_0000000048 16 126 110
SF_0000000555 70582 71504 - SF_0000000350 8970 9886 916
SF_0000000555 100212 101204 - SF_0000000350 9584 10597 1013
SF_0000000555 101165 101747 - SF_0000000350 9005 9581 576
SF_0000000555 82434 82891 - SF_0000000350 9273 9730 457