Вопрос или проблема
У меня есть список IP, таких как
35.195.23.184 134.209.172.147 207.90.244.14 179.43.191.98 77.90.22.16 222.95.163.138 95.214.53.91 45.230.66.15 199.45.155.111 5.8.11.202 185.191.126.248 154.83.15.156 71.6.232.28 35.204.124.189 141.98.11.178 64.62.197.44 64.62.197.36 64.62.197.33 185.242.226.99 46.19.69.70 114.33.100.55 95.214.55.79 114.35.57.211 162.191.196.61 87.120.126.85 2.196.195.65 118.163.142.112 80.82.77.202 182.44.10.178 114.38.214.165 175.107.1.178 122.116.134.171 109.205.213.198 178.215.238.69 122.116.158.160 93.174.93.12 147.45.112.17 59.126.25.244 59.126.254.199 40.83.134.151 125.228.162.168 220.134.106.248 45.115.89.120 4.255.98.186 87.120.114.229 45.84.89.3 46.174.191.28 95.214.53.211 141.98.11.175 125.228.214.129 36.139.63.123 180.149.126.8 122.116.183.60 185.82.219.179 165.154.206.35 106.75.146.146 106.75.169.16 59.126.115.226 59.182.82.59 47.91.91.123 34.77.49.75 45.148.10.206 45.156.130.18 87.236.176.150 167.94.145.96 199.45.154.130 205.210.31.30 147.185.132.30 64.62.156.83 35.203.210.49 100.0.161.38 1.34.209.79
(не беспокойтесь о том, что они здесь размещены, они все были пойманы как источники агрессивных атак при помощи ловушки).
Теперь в оболочке bash я хочу переформатировать этот список – пробелы между ними должны быть заменены на запятую и пробел (, ) для удобного использования в файле hosts.deny. Моя проблема: обычная замена bash или sed всегда выдает ошибку “плохая подстановка”. Похоже, мне нужно как-то экранировать пробел/запятую.
Итак, мой вопрос: как мне заменить все пробелы в этом списке на сочетание запятая/пробел?
Спасибо!
Работает для меня. Вы правильно указываете подстановку?
$ echo 35.195.23.184 134.209.172.147 207.90.244.14 | sed 's/ /, /g'
35.195.23.184, 134.209.172.147, 207.90.244.14
Используя любой awk:
$ awk -v OFS=', ' '{$1=$1} 1' file
35.195.23.184, 134.209.172.147, 207.90.244.14, 179.43.191.98, 77.90.22.16, 222.95.163.138, 95.214.53.91, 45.230.66.15, 199.45.155.111, 5.8.11.202, 185.191.126.248, 154.83.15.156, 71.6.232.28, 35.204.124.189, 141.98.11.178, 64.62.197.44, 64.62.197.36, 64.62.197.33, 185.242.226.99, 46.19.69.70, 114.33.100.55, 95.214.55.79, 114.35.57.211, 162.191.196.61, 87.120.126.85, 2.196.195.65, 118.163.142.112, 80.82.77.202, 182.44.10.178, 114.38.214.165, 175.107.1.178, 122.116.134.171, 109.205.213.198, 178.215.238.69, 122.116.158.160, 93.174.93.12, 147.45.112.17, 59.126.25.244, 59.126.254.199, 40.83.134.151, 125.228.162.168, 220.134.106.248, 45.115.89.120, 4.255.98.186, 87.120.114.229, 45.84.89.3, 46.174.191.28, 95.214.53.211, 141.98.11.175, 125.228.214.129, 36.139.63.123, 180.149.126.8, 122.116.183.60, 185.82.219.179, 165.154.206.35, 106.75.146.146, 106.75.169.16, 59.126.115.226, 59.182.82.59, 47.91.91.123, 34.77.49.75, 45.148.10.206, 45.156.130.18, 87.236.176.150, 167.94.145.96, 199.45.154.130, 205.210.31.30, 147.185.132.30, 64.62.156.83, 35.203.210.49, 100.0.161.38, 1.34.209.79
Ответ или решение
Для замены специальных строк в файлах с использованием Bash, особенно в случае, когда необходимо преобразовать пробелы между строками IP-адресов в комбинацию ", ", можно воспользоваться полезными командами, такими как sed
и awk
. Это особенно актуально, когда необходимо создать формат, совместимый с файлами конфигурации, такими как hosts.deny
.
Пример задачи
У вас есть список IP-адресов, представленный пробелами, и необходимо заменить эти пробелы на запятую и пробел (,
). Исходная строка выглядит следующим образом:
35.195.23.184 134.209.172.147 207.90.244.14 ...
Решения с использованием sed
Одним из наиболее простых способов решения этой задачи является использование команды sed
. Вот пример команды:
echo "35.195.23.184 134.209.172.147 207.90.244.14 ..." | sed 's/ /, /g'
В этом примере:
s/ /, /g
— это выражение замены, в котором:s
означает замену,,
— строка, на которую мы заменяем,g
— флаг, который указывает на глобальную замену всех вхождений в строке.
Решение с использованием awk
Еще одним эффективным методом является использование awk
. Команда может выглядеть следующим образом:
echo "35.195.23.184 134.209.172.147 207.90.244.14 ..." | awk -v OFS=', ' '{$1=$1} 1'
Здесь:
-v OFS=', '
— задает выходной разделитель полей.{$1=$1}
— вызывает пересчет всех полей, что приводит к формированию нового формата по заданному разделителю.1
— это эквивалентprint
, который выводит текущую строку.
Итог
Эти два метода позволяют легко и быстро заменить пробелы на комбинацию ", ", что значительно облегчает работу с форматами конфигурационных файлов. Выбор между sed
и awk
зависит от ваших предпочтений и контекста использования, так как обе команды позволяют достичь одного и того же результата.
Таким образом, воспользовавшись вышеописанными командами, вы сможете форматировать свои данные так, чтобы они были готовы для использования в файле hosts.deny
, что делает вашу систему более безопасной, организованной и управляемой.