Редактирование файла на месте с помощью perl или awk

Просмотр логов:

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"

Теперь повторяющихся маршрутов больше не будет:)

1
06.08.2019, 23:46
4 ответа

Для редактирования на месте может быть проще сделать что-то вроде

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

Немного грубой силы, но чертовски проще.

1
27.01.2020, 23:30

Попробуйте это:

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
1
27.01.2020, 23:30

В перле:

#!/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
0
27.01.2020, 23:30

команда

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
-1
27.01.2020, 23:30

Теги

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