我需要为每个八位字节填充零地址的IP地址
问题描述:
从一个未指定长度的字符串开始,我需要使其长度正好为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
是否适合这种类型的东西?
答
这使用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"
答
是的,听起来像是一个很好的匹配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
$ IFS - 您已经帮助过我多于一次的那个DW :) – 2010-06-13 13:28:50
接受的答案是使用否外部可执行文件。 – 2010-06-13 13:31:29
这工作。但我想知道为什么使用数组?具有空格分隔值的单个变量_not_会不会完成这项工作?它会以某种方式与'printf'冲突吗? – 2010-06-13 13:54:34