2010-06-13 2 views
1

À partir d'une chaîne d'une longueur indéterminée, j'ai besoin de faire exactement 43 caractères (rembourré avant avec des zéros). Il va contenir des adresses IP et des numéros de port. Quelque chose comme:J'ai besoin de tamponner les adresses IP avec des zéros pour chaque octet

### 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 

Ceci est similaire à la sortie produite par tcpflow.

Programmation dans Bash. Je peux fournir une copie du script si nécessaire.
Si cela est possible, il serait bon d'utiliser un bash intégré, pour la vitesse. Est-ce que printf est approprié pour ce genre de chose?

Répondre

3

Il utilise IFS pour diviser les informations d'adresse dans un tableau. printf enregistre ensuite le résultat formaté dans la variable d'origine pour un traitement ultérieur. Pure Bash - aucun exécutable externe n'est utilisé.

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" 

Edit:

Sans l'aide d'un tableau:

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 - vous m'avez aidé avec celui-là plus d'une fois maintenant DW :) –

+0

Réponse acceptée pour l'utilisation non exécutables externes. –

+0

Cela fonctionne. Mais j'aimerais savoir pourquoi un tableau a été utilisé? Est-ce qu'une seule variable avec des valeurs séparées par des espaces _not_ fait aussi le travail? Cela entrerait-il en conflit avec 'printf' d'une façon ou d'une autre? –

1

Oui, cela ressemble à une excellente correspondance pour printf. Vous pouvez probablement utiliser cut pour diviser l'adresse entrante en champs, que vous pouvez ensuite réinjecter dans printf pour effectuer le formatage.

Voici un croquis rapide, il peut certainement être amélioré pour obtenir le format de sortie exacte dont vous avez besoin:

#!/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

Nice. Mais le '-' doit apparaître entre les deux ensembles: 066.035.005.123.00080-137.030.123.078.52172 –

Questions connexes