2010-06-13 53 views
1

从一个未指定长度的字符串开始,我需要使其长度正好为43个字符(用零填充前缀)。它将包含IP地址和端口号。例如:我需要为每个八位字节填充零地址的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是否适合这种类型的东西?

回答

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" 
+0

$ IFS - 您已经帮助过我多于一次的那个DW :) – 2010-06-13 13:28:50

+0

接受的答案是使用否外部可执行文件。 – 2010-06-13 13:31:29

+0

这工作。但我想知道为什么使用数组?具有空格分隔值的单个变量_not_会不会完成这项工作?它会以某种方式与'printf'冲突吗? – 2010-06-13 13:54:34

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 
+0

尼斯。但是' - '必须出现在两组之间: 066.035.005.123.00080-137.030.123.078.52172 – 2010-06-13 12:17:53