Заменить 0 на 1000 в порту 0 и увеличить на +1 в следующих строках

Вам необходимо убедиться, что ваша переменная GPG_TTYверна; добавить

GPG_TTY=$(tty)
export GPG_TTY

к сценариям запуска вашей оболочки, в том числе для не -оболочек входа в систему (ваши оболочки входа, вероятно, в порядке, но не не -оболочки входа, поэтому это не работает вtmux).

-2
05.02.2021, 10:49
4 ответа
k=1000
m=$(echo "$k\\";printf '%s' {0..9})

sed -En "
  1{x;s/.*/$m/;x;}

  /local-ip/!{p;d;}
  G
  s/(port )0(.*)\n(.*)\n.*/\1\3\2/
  p;g;trst;:rst

  # port+1
  s/([0-8])(\n.*\1(.))/\3\2/;h;t
  s/(9+)\n/_&/
  :a;s/(_9*)9(0*\n)/\10\2/;ta
  s/^_/0&/
  s/(.)_(0+\n.*\1(.))/\3\2/
  h
"  file

Выход:

local-ip 155.165.170.10 port 1000 remote-ip 155.16.241.11 port 3869 
local-ip 155.165.170.10 port 1001 remote-ip 155.16.241.11 port 3869
local-ip 155.165.170.10 port 1002 remote-ip 155.16.241.11 port 3869
local-ip 155.165.170.10 port 1003 remote-ip 155.16.241.11 port 3869

для увеличения на 1 мы должны позаботиться о двух вещах. Является ли lsd не -9 или последовательностью последовательных 9. В случае первого мы просто заменяем lsd его следующей старшей цифрой. И в последнем случае мы меняем все lsd 9 на 0 и заменяем соседа на следующую более высокую цифру. Затем сохраните обратно для следующей итерации

1
18.03.2021, 22:32

С awk это довольно просто. Например:

awk 'BEGIN { portno=1000 }
           { print $1, $2, $3, portno++, $5, $6, $7, $8 }' inputfile

Это предполагает, что все строки отформатированы, как в вашем примере.

2
18.03.2021, 22:32

Вы сможете сделать это вawk:

awk 'BEGIN{p=1000} $1=="local-ip"{$4=p++} 1' input.cfg > output.cfg

Это будет анализировать все строки, начинающиеся с local-ip(, как небольшой сейф -защищать от пустых строк или строк комментариев )и заменять 4-е поле (текущий номер порта )последовательно увеличивающимся номером, начиная с 1000.

Обновление

Поскольку вы указали в комментарии, что хотите сделать это для нескольких файлов, вы можете использовать следующий цикл оболочки:

for f in input{1..16}.cfg; do n=${f/input/output}; awk 'BEGIN{p=1000} $1=="local-ip"{$4=p++} 1' "$f" > "$n"; done

Это зациклит все файлы, соответствующие input{1..16}.cfg, заменит inputна outputдля получения выходного имени файла nи применит программу awk, указанную выше, к каждой паре ввода/вывода. Обратите внимание, что номера портов будут перенумерованы локально для файла, т. е. каждый файл перезапускается с порта 1000.

7
18.03.2021, 22:32

По сути, у вас есть два варианта.

Вариант 1:Запустить awk для каждого входного файла

# Loop over the input file numbers and run awk for each
for ((i=0; i<10; i++)); do awk '$1=="local-ip"{$4=1000+p++;}1' input$i.txt > output$i.txt; done

Вариант 2:Создание выходных файлов непосредственно с помощью awk

awk 'FNR==1{p=1000; sub("input", "output", FILENAME)} $1=="local-ip"{$4=p++} {print >> FILENAME}' input*.txt

Если вы не хотите начинать заново с port 0для каждого входного файла, вам нужно запустить awk только один раз (, чтобы он знал текущее глобальное значение ). В качестве альтернативы NR==1{p=1000}вы можете использовать более простую логику из Вариант 1 :

.
awk 'FNR==1{sub("input", "output", FILENAME)} $1=="local-ip"{$4=1000+p++} {print >> FILENAME}' input*.txt
1
18.03.2021, 22:32

Теги

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