我需要为每个八位字节填充零地址的IP地址

时间:2010-06-13 11:13:11

标签: bash string

从一个未指定长度的字符串开始,我需要使其长度恰好为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 个答案:

答案 0 :(得分:3)

这使用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"

修改

不使用数组:

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 :(得分:1)

是的,听起来像是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