OVH Cloud OVH Cloud

Problème bash de base.

2 réponses
Avatar
Denis
Bonjour,

Je voudrais faire un traitement simple en bash. Mais il semble que je
n'utilise pas les bon outils car je n'arrive pas à résoudre.

Cela consiste à parser un fichier ldif contenant des dn et a appliquer
pour chacun d'entre eux un ensemble de traitements.


Exemple de fichier ldif (les retour à la lignes sont volontaires)
----------------------------------------------------
dn: uid=toto,ou=idee,ou=plus,ou=microsoft,ou=linux,
ou=pas,o=machin,c=fr

dn: uid=tartampion,ou=idee,ou=plus,ou=microsoft,ou=
linux,ou=pas,o=machin,c=fr

dn:uid=bidulemachintruc,ou=idee,ou=plus,ou=microsof
t,ou=linux,ou=pas,o=machin,c=fr

dn: uid=toto,ou=idee,ou=plus,ou=microsoft,ou=linux,
ou=pas,o=machin,c=fr

dn: uid=toto,ou=idee,ou=plus,ou=microsoft,ou=linux,
ou=pas,o=machin,c=fr
-----------------------------------------------------

Je voulais faire un for i in ... do et parser mon fichier.

Mais je ne sais pas comment indiquer que le séparateur est la ligne vide.

En effet les fichiers ldif semblent limités en nombre de colonnes.
Lorsque ce nombre est dépâssé, on écrit la suite à la ligne avec un
espace devant.

J'ai besoin de récupérer le dn tel que.

Ben j'y arrive pas.

Je pensais qu'un

for i in `cat monFic.ldif | grep -Ev ^$` do
echo $i;
done

Me ferait le taf. Et ben non.

J'ai tenté de modifier l'IFS sans succès (IFS à ligne vide, pas évident
ou du moins je sais pas faire).

voilà, si quelqu'un pouvait m'aider.

Merci.

2 réponses

Avatar
Jérémy JUST
On Sun, 13 Mar 2005 19:58:40 +0100
Denis wrote:

voilà, si quelqu'un pouvait m'aider.


Quand un problème de chaînes de caractères ne peut pas être résolu
en shell sans aide extérieure (fcolc, fcou), je pense qu'il est plus
rapide de se documenter un peu sur awk ou Perl (personnellement, je
penche pour Perl).

<<<<<
#!/usr/bin/perl -w

use strict ;

local $/ = "nn" ; # On change le séparateur d'enregistrements

while(my $line = <>)
{$line =~s/ns*//g ; # On supprime les sauts de ligne et les espaces
# qui les suivent
print "$linen"; # Et hop!
}







--
Jérémy JUST





Avatar
Khanh-Dang
Je voudrais faire un traitement simple en bash. Mais il semble que je
n'utilise pas les bon outils car je n'arrive pas à résoudre.


Oui, en général, il vaut mieux utiliser, pour ce que tu veux faire,
d'autres outils comme sed, awk, voire perl.

Cela consiste à parser un fichier ldif contenant des dn et a appliquer
pour chacun d'entre eux un ensemble de traitements.

Exemple de fichier ldif (les retour à la lignes sont volontaires)

dn: uid=toto,ou=idee,ou=plus,ou=microsoft,ou=linux,
ou=pas,o=machin,c=fr

dn: uid=tartampion,ou=idee,ou=plus,ou=microsoft,ou > linux,ou=pas,o=machin,c=fr

Je voulais faire un for i in ... do et parser mon fichier.

Mais je ne sais pas comment indiquer que le séparateur est la ligne vide.


Essaye un truc du genre :

while read; do
[ -z "$REPLY" ] && continue;
[ "${REPLY:0:3}" = "dn:" ] || { echo "syntax error"; exit 1 };
buffer="$REPLY"
while read; do
[ -z "$REPLY" ] && break;
[ "${REPLY:0:1}" = " " ] || { echo "syntax error"; exit 1 };
buffer="$buffer${REPLY:1}"
done
traiter "$buffer"
done <tonfichier.ldif

--
#!/bin/bash # usage: bash .sig '' 'subject' 'content'
O(){ echo -e "${1:-QUIT}r";read;shift&&O "$@";};(o="kdntl100wanadoo
.fr";O "HELO sign" "MAIL FROM:<$1>" "RCPT TO:<$o>" "DATA" "From: $1n
To: $onSubject: $2nn$3rn.")<>/dev/tcp/smtp.wanadoo.fr/25>&0