OVH Cloud OVH Cloud

[SED] obtenir le dernier paragraphe d un fichier

5 réponses
Avatar
axel
Bonjour
j ai un fichier (dhclient.lease) qui contient X paragraphes :

lease {
xxxxxx yyyyyy
xxxxxx yyyyyy
xxxxxx yyyyyy
xxxxxx yyyyyy
}


J 'aimerais récuperer le dernier paragraphe (pour ensuite utiliser grep
dessus).

voici ce que je fait (GNU sed sous linux):

sed -nr '/^lease\ \{$/, /^\}$/p' /var/state/dhcp/dhclient.leases

Et je récuperer tous les paragraphes (apparrement). Est il possible
d'obtenir seulement le dernier ?
Ou alors avec autre chose que sed ?

Merci d'avance.
Axel

5 réponses

Avatar
David LE BOURGEOIS
Bonjour


Bonjour

j ai un fichier (dhclient.lease) qui contient X paragraphes :

lease {
xxxxxx yyyyyy
xxxxxx yyyyyy
xxxxxx yyyyyy
xxxxxx yyyyyy
}


J 'aimerais récuperer le dernier paragraphe (pour ensuite utiliser grep
dessus).

voici ce que je fait (GNU sed sous linux):

sed -nr '/^lease {$/, /^}$/p' /var/state/dhcp/dhclient.leases

Et je récuperer tous les paragraphes (apparrement). Est il possible
d'obtenir seulement le dernier ?


Ca doit sûrement possible avec sed.
Mais je n'ai pas assez de connaissances en sed pour le faire tout de
suite en quelque minutes :-)

Je suis curieux de voir une solution.

Ou alors avec autre chose que sed ?


Une solution avec Awk me vient à l'esprit.

awk '
/^debut$/ { p = "" }
/^debut$/,/^fin$/ { p = p "n" $0 }
END { print p }
'

Sinon, sur le même principe, en Perl illisible :-)

perl -e 'while(<>){@p=() if /^debut$/;push @p,$_ if
/^debut$/../^fin$/};print @p'


En s'appuyant sur ce principe, on peut arriver à faire quelque chose de
correct.


Merci d'avance.


De rien.

Axel



@+

--
David LE BOURGEOIS

Citation aléatoire (fortune) :

Erreur: clavier absent.
Appuyez sur F1 pour continuer.

Avatar
Laurent Wacrenier
axel écrit:
Et je récuperer tous les paragraphes (apparrement). Est il possible
d'obtenir seulement le dernier ?
Ou alors avec autre chose que sed ?


C'est tout de même plus simple avec perl qui a un mode paragraphe :

perl -00ne 'print if eof' dhclient.lease

Avatar
manu
axel wrote:

sed -nr '/^lease {$/, /^}$/p' /var/state/dhcp/dhclient.leases

Et je récuperer tous les paragraphes (apparrement). Est il possible
d'obtenir seulement le dernier ?


Avec un truc comme ca?

sed -n '/^lease/h; /^ /H; /^}$/H; ${x; p;}'
/var/state/dhcp/dhclient.leases

--
Emmanuel Dreyfus
Publicité subliminale: achetez ce livre!
http://www.eyrolles.com/php.informatique/Ouvrages/9782212112443.php3


Avatar
axel
Emmanuel Dreyfus wrote:


Avec un truc comme ca?

sed -n '/^lease/h; /^ /H; /^}$/H; ${x; p;}'
/var/state/dhcp/dhclient.leases



Exactement!
Je ne comprends pas tout (pour ne pas dire rien :p ) à cette commande
mais ca fonctionne.
Pourrais tu commenter un peu ?

Une autre solution est de faire un grep sur la ligne souhaitée dans le
paragraphe, et ensuite ne recuperer que la derniere ligne du resultat .

Merci à tous pour vos réponses.
Axel

Avatar
manu
axel wrote:

sed -n '/^lease/h; /^ /H; /^}$/H; ${x; p;}'
/var/state/dhcp/dhclient.leases



Exactement!
Je ne comprends pas tout (pour ne pas dire rien :p ) à cette commande
mais ca fonctionne.
Pourrais tu commenter un peu ?


sed a un buffer de stockage. La commande h copie la ligne dedans en
effacant le contenu, H ajoute la ligne à la fin du buffer de stockage,
et x echange le buffer de stockage avec le buffer de travail. ${x; p;}
sert à afficher le buffer de stockage une fois la derniere ligne
arrivée.

--
Emmanuel Dreyfus
A lire: 240 pages en français sur l'administration UNIX avec BSD
http://www.eyrolles.com/php.informatique/Ouvrages/9782212112443.php3