2015-10-02 3 views
1

Мне интересно, как Баш может решить следующее упражнение. У меня есть набор конфигурационных файлов в одном каталоге, где указаны некоторые IP-адреса. Например:Замена текстовых строк в наборе файлов

conf1.txt:

ip-addr: 192.168.1.2; 
mask...; 
gateway...; 
another ip-addr: 192.168.1.5; 
one more ip-addr: 192.168.1.10; 
... 

conf2.txt:

ip-addr: 192.168.1.2; 
mask...; 
gateway...; 
another ip-addr: 192.168.1.5; 
one more ip-addr: 192.168.1.10; 
... 

И вопрос: Как я могу изменить все IP-адреса с другой пул IP-адресов (192.168.1.100-192.168.1.254), но во всех файлах. Так, например:

  • 192.168.1.2 -> 192.168.1.100
  • 192.168.1.5 -> 192.168.1.101
  • 192.168.1.10 -> 192.168.1.102

Я полагаю, что является некоторым механизмом назначения значений из одного массива в другой, поскольку такая жесткая кодировка, как:

sed "s/192.168.1.2/192.168.1.100/g"; 

Не работает.

+2

Вы ищете решение с использованием Баш + стандартные инструменты оболочки или вы готовы рассмотреть возможность использования более мощного языка, таких как Perl? –

+0

I'mnot bash guru, но я бы сделал следующее: прочитайте из файла http://stackoverflow.com/questions/10929453/bash-scripting-read-file-line-by-line, а затем разделите каждую строку http: // stackoverflow.com/questions/918886/how-do-i-split-a-string-on-a-delimiter-in-bash и заменить на sed в конце. –

+0

Я предпочитаю использовать bash script + shell tools – ascentman

ответ

1

Вы хотите автоматическое создание новых IP-адресов? Если это так, вот один из способов сделать это:

conf_files=config*.txt 
pre=192.168.1. 
suf=100 

grep -hoP '([0-9]{1,3}\.){3}[0-9]{1,3}' $conf_files | 
sort -u | 
while read ip; do 
    if ((suf > 254)); then 
     print "Error: Oops! Suffix is more than 254" >&2 
     exit 1 
    fi 
    sed -i "s:$ip:$pre$suf:g" $conf_files 
    ((suf++)) 
done 

Вот как это работает:

  1. Извлечь все IP-адреса из файлов конфигурации
  2. отсортировать и удалить дубликаты
  3. В в то время как цикл, рассчитать новый IP и
  4. использовать sed для замены старых IP-адресов
2

Возможно, немного подробный, но он должен это сделать. Во-первых, список команд подстановки собран во временный файл, а затем выполняется sed для выполнения этих подстановок.

cmds=$(mktemp) 
while read line 
do 
    printf "s/%s/%s/g\n" $line >> $cmds 
done < ip_table 

sed -f $cmds input > output 
rm -f $cmds 

Здесь предполагается, что таблица преобразования IP будет храниться в файле с 2-колонками ip_table

192.168.1.2 192.168.1.100 
192.168.1.5 192.168.1.101 

Хотя отмечают, что такой подход соответствует его кончине должна таблица перевода IP выглядеть

192.168.1.2 192.168.1.100 
192.168.1.100 192.168.1.5 

потому что тогда 192.168.1.2 заменен на 192.168.1.5.

1

Жесткий код sed не очень приятный. К счастью, вы можете создать сценарий sed динамически.

grep -ho '192\.168\.1\.[0-9]\+' conf*.txt \ 
    | sort | uniq | nl -v100 \ 
    | sed 's/\./\\./g;s/ *\(.*\)\t\(.*\)/s=\2=192.168.\1=g/' | LC_ALL=C sort \ 
    | sed -f- conf*.txt 

Первая строка извлекает все IP-адреса (обратите внимание, что есть другие способы их выражения).

Вторая строка выбрасывает дубликаты и номер строки, начинающиеся с 100.

Третья строка изменяет каждый IP-адрес предшествовал ряд в команду sed. Затем команды сортируются так, что 0.0.0.100 заменяется до 0.0.0.10.

Последняя строка запускает сгенерированный скрипт на входных файлах.

Ошибки: не проверяет, является ли число линий < 157.

Смежные вопросы