Мне нужно дополнить IP-адреса нулями для каждого октета - PullRequest
1 голос
/ 13 июня 2010

Начиная со строки неопределенной длины, мне нужно сделать ее ровно 43 символа (с добавлением нулей).Он будет содержать IP-адреса и номера портов.Что-то вроде:

### BEFORE
# Unfortunately includes ':' colon
66.35.205.123.80-137.30.123.78.52172:
### AFTER
# Colon removed.
# Digits padded to three (3) and five (5) 
# characters (for IP address and port numbers, respectively)
066.035.005.123.00080-137.030.123.078.52172  

Это похоже на вывод, полученный при tcpflow .

Программирование в Bash.Я могу предоставить копию скрипта, если требуется.
Если это вообще возможно, было бы неплохо использовать встроенный bash, для скорости.printf подходит для этого типа вещей?

Ответы [ 2 ]

3 голосов
/ 13 июня 2010

Используется IFS для разделения информации об адресе в массив. Затем printf сохраняет отформатированный результат обратно в исходную переменную для дальнейшей обработки. Pure Bash - внешние исполняемые файлы не используются.

addr='66.35.205.123.80-137.30.123.78.52172:'
saveIFS=$IFS
IFS='.-:'
arr=($addr)
IFS=$saveIFS
printf -v addr "%03d.%03d.%03d.%03d.%05d-%03d.%03d.%03d.%03d.%05d" ${arr[@]}
do_something "$addr"

Edit:

Без использования массива:

addr='66.35.205.123.80-137.30.123.78.52172:'
saveIFS=$IFS
IFS='.-:'
printf -v addr "%03d.%03d.%03d.%03d.%05d-%03d.%03d.%03d.%03d.%05d" $addr
IFS=$saveIFS
do_something "$addr"
1 голос
/ 13 июня 2010

Да, звучит как отличный матч для printf. Вероятно, вы можете использовать cut, чтобы разбить входящий адрес на поля, которые затем можно будет передать обратно в printf для форматирования.

Вот быстрый набросок, который, безусловно, можно улучшить, чтобы получить точный выходной формат, который вам требуется:

#!/usr/bin/env bash

function format_address()
{
    printf "%03d.%03d.%03d.%03d.%05d" $(echo $1 | cut -d'.' --output-delimiter=' ' -f1-5)
}

for a in $(echo $1 | tr -d ':' | cut -d '-' --output-delimiter=' ' -f1,2)
do
    format_address $a
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...