2010-06-13 94 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