Shell scripting

Fermé
ndmiron Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 24 janvier 2008 - 23 janv. 2008 à 17:03
ndmiron Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 24 janvier 2008 - 24 janv. 2008 à 00:22
for INTS in `cat interfaces` # interfaces contient une liste de nom de fichiers
do
for SEDS in `cat ./$INTS.INT` #.INT contient une liste interfaces / IPs [ethx]/[10.0.0.0]
do
cat $INTS | sed "s/$SEDS/" > $INTS.SEDDED

cat $INTS.SEDDED | gawk -F" " '!($4 ~ /255.255.255/ || $5 ~ /255.255.255/ || $6 > 30000 ) {print $4" "$5" "$6" "$7}' | sort -t" " -k1 > $INTS.OUTGOING
done

done



Voici mon problème - le $INTS.SEDDED est écrasé ce qui normal. Je dois en fait faire de multiples sed avec un input de fichier
Au final, je veux $INTS.OUTGOING qui contient les modifs $INTS.INT que je veux appliquer. Serait-ce possible de lire plusieurs fichiers en mémoire et un seul output?... ou une manière plus simple avec un compteur.

Merci
A voir également:

13 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
23 janv. 2008 à 17:33
Salut,

sed "s/$SEDS/"

C'est supposé faire quoi cette commande ? Parce que vu d'ici elle est incomplète :-\
La commande "s" doit contenir un "motif cible" dans sa partie gauche et un motif de remplacement (ou vide pour effacer) dans sa partie droite...
0
ndmiron Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 24 janvier 2008 4
23 janv. 2008 à 18:26
elle choppe une interface exemple eth0 et la remplace par une adresse IP
sous le format "eth0/10.0.0.0"
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
23 janv. 2008 à 18:37
Je m'excuse mais non ! Sous cette forme c'est pas possible !!!
$ VARIABLE="Bonjour"

$ echo "Bonjour toi" | sed "s/$VARIABLE/"
sed: -e expression n°1, caractère 10: commande `s' inachevée
;-(
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
23 janv. 2008 à 20:07
Pour répondre à la question initiale, ">>" concatène et ajoute à la suite, alors que ">" écrase tout à chaque passage...

Mais bon, toi tu sais ce que contiennent tes fichiers, tes variables et ce que sont censées renvoyées tes instructions, nous vu d'ici on suppute, donc si tu nous mets des exemples précis et imagés, plus on sera à même de t'aider.

;-))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ndmiron Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 24 janvier 2008 4
23 janv. 2008 à 21:24
mais si je veux exécuter 5 seds disons .. sur un fichier complet. Je veux faire 5 traitements et non ...> et ensuite >> concatener

mais plutôt lire un fichier, 5 seds avec les paramètre mentionnés plus haut et un output vers un fichier >.


Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
23 janv. 2008 à 21:37
Je veux faire 5 traitements
Lesquels ?

Comme dit dans mon précédent message, DES EXEMPLES !!!

J'ai ça (bla...bla...bla...) dans mon fichier, je veux extraire ça (bla) avec cette commande (cmd), et l'envoyer dans ... puis recommencer le traitement et extraire ça (bli...bli) et quand c'est fini, je voudrai que mon fichier de sortie ressemble à ça .....

Merci ;-))
0
ndmiron Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 24 janvier 2008 4
23 janv. 2008 à 21:54
voici un exemple complet: un fichier interface contient une liste de noms de fichiers comme suit:

ServeurDebian2122
ServeurRedhat1223
ServeurSolaris2231

Chaque fichier en soit physiquement contient du data (FLUX) que je veux traiter en y appliquant le data contenu dans les fichiers .INT (voici ce qu'ils contiennent ci-dessous)

le fichier ServeurDebian2122.INT contient:

eth0/10.0.1.43
eth1/10.0.2.44

le fichier ServeurRedhat1223.INT contient:

eth2/172.12.0.4
eth3/10.0.2.2

le fichier Solaris.INT contient:

eth5/172.12.2.4
eth3/10.2.23.2

N.B.: mon problème est au niveau des SEDS... Je comprends qu'avec "> $INTS.SEDDED" j'écrase mais si je concatonne... je peux retrouve avec des copies des sed.. une après l'autre alors que je veux appliquer les sed sur le même input en boucle et je veux un seul fichier output non concaténé.


for INTS in `cat interfaces` # interfaces contient une liste de nom de fichiers
do
for SEDS in `cat $INTS.INT` #.INT contient une liste interfaces / IPs [ethx]/[10.0.0.0]
do
cat $INTS | sed "s/$SEDS/" > $INTS.SEDDED

cat $INTS.SEDDED | gawk -F" " '!($4 ~ /255.255.255/ || $5 ~ /255.255.255/ || $6 > 30000 ) {print $4" "$5" "$6" "$7}' | sort -t" " -k1 > $INTS.OUTGOING

done

done
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
23 janv. 2008 à 22:08
Ok, j'y vois plus clair.

Mais qu'est censé contenir le fichier "$INTS.SEDDED" en sortie ?
La liste de chaque interface et son adresse associée ?

Et qu'est supposé contenir le fichier "$INTS.OUTGOING" ?
0
ndmiron Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 24 janvier 2008 4
23 janv. 2008 à 22:31
en fait les Sed... en boucle... je veux obtenir un fichier... avec les remplacements faits....

Le problème c'est au niveau des SED.. et comment faire les SED en boucle pour n'avoir qu'un seul fichier en sortie auquel j'applique disons à $INTS ou $INTS.SEDDED.... unun gawk ... et un sort... vers le final $INTS.OUTGOING

voilà
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
23 janv. 2008 à 22:56
cat $INTS | sed "s/$SEDS/" > $INTS.SEDDED
Cette ligne est incorrecte du début jusqu'à la fin !!!

$INT contient la valeur d'une variable (disons dans ton cas la 1ère ligne du fichier "interfaces", soit "ServeurDebian2122"). La commande "cat" renvoie :
cat: ServeurDebian2122: Aucun fichier ou répertoire de ce type
c'est normal, le fichier s'appelle en réalité "ServeurDebian2122.INT". Il manque donc l'extension.

Ensuite, si on analyse la commande "sed", je te l'ai déjà dit dans mon 1er post et illustré dans le 2nd ,elle est incorrecte, mais dans ton cas elle marche quand même car voilà comment est interprété la variable "$SED" (qui contient "eth0/10.0.1.43") :
sed s/eth0/10.0.1.43/
ce qui en fait une syntaxe parfaite pour la commande "s" de sed.

Par contre je ne pense pas que ce soit ce que tu veuilles vraiment, si ?

Tu ne m'as toujours pas dit ce que tu veux récupérer dans chaque fichier et sous quelle forme ! J'insiste mais on tourne en rond là :-))

Tu veux récupérer chaque adresse IP dans un fichier ?
0
ndmiron Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 24 janvier 2008 4
23 janv. 2008 à 23:46
J'ai des fichiers ServeurRedhat1223, Redhat etc qui contiennent mes flux (mon traffic tcp/IP)
J'ai des fichiers ServeurRedhat1223.INT qui contiennent les changements que je veux faire [INTERFACE/IPADDRESS].

Je veux appliquer ServeurRedhat1223.INT en sed à ServeurRedhat1223, Redhat.INT à Redhat .. etc.

Une fois complétée, je fais un gawk et un sort.

La commande sed est bien interprétée.

----
cat $INTS | sed "s/$SEDS/" > $INTS.SEDDED
Cette ligne est incorrecte du début jusqu'à la fin !!!

$INT contient la valeur d'une variable (disons dans ton cas la 1ère ligne du fichier "interfaces", soit "ServeurDebian2122"). La commande "cat" renvoie :cat: ServeurDebian2122: Aucun fichier ou répertoire de ce type
----

Pour commenter ce que vous m'avez répondu... le cat $INTS dans la 2e boucle en fait contient la valeur retournée de la variable de la première boucle soit `cat interfaces` [qui en fait retourne la liste de nom de fichier flux ligne par ligne]
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
24 janv. 2008 à 00:06
Je m'excuse mais je ne comprends toujours pas ;-((

Je veux appliquer ServeurRedhat1223.INT en sed à ServeurRedhat1223
Ça ça ne veut strictement rien dire, enfin pour moi.
Que veux-tu faire avec "sed" ?

Tant que tu ne me donneras pas un exemple précis...
0
ndmiron Messages postés 10 Date d'inscription mercredi 23 janvier 2008 Statut Membre Dernière intervention 24 janvier 2008 4
24 janv. 2008 à 00:22
dans les fichier.int... il y a les entrées eth0/192.0.0.0 ... etc... les interfaces = les adresses ip réelles

je veux substituer dans les fichiers flux ... les eth0 pour les remplacer par les adresses ip réelles.
0