从一个未指定长度的字符串开始,我需要使其长度恰好为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
是否适合此类事情?
答案 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