Extraction de nombre d'une ligne

Résolu/Fermé
thomas57070 Messages postés 178 Date d'inscription mercredi 7 décembre 2011 Statut Membre Dernière intervention 31 janvier 2014 - Modifié par thomas57070 le 29/01/2014 à 09:19
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 31 janv. 2014 à 10:33
Bien le bonjour,

Voilà je suis un petit script perl, à un moment dans mon script je sort les ouvertures et fermetures de session du fichier "/var/log/auth.log" je fais un split de chaque ligne quand elle contient "session opened" ou "session closed" il en ressort :
CRON[14..]:
su[6..]:
...

Ce que je voudrais c'est en retirer juste le numéro du processus entre crochet, voilà mon problème cela ne doit pas être bien sorcier mais je bloque =/ si quelqu'un à une idée !

Tout vient à point à qui sait attendre !
A voir également:

3 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
29 janv. 2014 à 09:52
Salut thomas57070,

Si tu veux retirer juste le numéro et que tu as une chaîne "CRON[14613]:", tu vas te retrouver avec "CRON[]:". Si c'est bien ce que tu veux, tu fais comme cela :

$st =~ s/([a-zA-Z]+\[)[0-9]+(\]:)/$1$2/;


Si ce que tu veux, en fait, c'est ne garder que "CRON", tu fais comme cela :

$st =~ s/([a-zA-Z]+)(\[[0-9]+\]:)/$1/;



Dal
0
thomas57070 Messages postés 178 Date d'inscription mercredi 7 décembre 2011 Statut Membre Dernière intervention 31 janvier 2014 8
29 janv. 2014 à 10:15
Merci de ta réponse qui soit dit en passant marche très bien mais en fait je crois que je me suis mal exprimé, je souhaite voir afficher que les chiffres entre les crochets : CRON[6413]: => 6413
0
thomas57070 Messages postés 178 Date d'inscription mercredi 7 décembre 2011 Statut Membre Dernière intervention 31 janvier 2014 8
29 janv. 2014 à 10:39
C'est bon j'ai légèrement modifié la commande
$st =~ s/([a-zA-Z]+\[)[0-9]+(\]:)/$1$2/; 
en
$st =~ s/([a-zA-Z]+\[)([0-9]+)(\]:)/$1$2/;

par contre j'ai quelques lignes récalcitrantes du genre :
2564
2705
gdm-session-1458
6541


Merci d'avoir répondu si vite [Dal], les expressions régulières j'ai encore un peu de mal.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
29 janv. 2014 à 13:49
Salut thomas57070,

Donne des exemples complets de lignes de ton log représentatives (avant traitement par tes splits, y compris les "récalcitrantes") et du résultat correspondant que tu veux obtenir pour chaque ligne.

Là, ce n'est pas clair pour moi.


Dal
0
thomas57070 Messages postés 178 Date d'inscription mercredi 7 décembre 2011 Statut Membre Dernière intervention 31 janvier 2014 8
Modifié par thomas57070 le 31/01/2014 à 09:53
Exemple de ligne qui ne posait pas de problème :
Jan 27 12:35:34 debian su[2048]: pam_unix(su:session): session opened for user root by (uid=1000)

Ligne récalcitrantes j'ai mis en gras ce qui m'embêter :
Jan 27 13:21:50 debian gdm-session-worker[1513]: pam_unix-gdm3:session): session opened for user toto by (uid=0)

au final maintenant c'est bon je fais :
=~ s/([a-zA-Z\-]+\[)([0-9]+)(\]:)/$2/;

au final après quelques split j'arrive à :
clef = 2048, session opened avec pour users root à la date du Jan 27 12:35:34
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
31 janv. 2014 à 10:33
Salut, cool, bravo !

Sinon, dans tes crochets de définition de la classe de caractères
[a-zA-Z\-]
, je pense que l'antislash est de trop, car le tiret est à la fin. Tu n'as pas à échapper ce qui est dans une classe est interprété tel que tapé (y compris le point, l'étoile, etc.), sauf exceptions.

Effectivement, si ce que tu veux récupérer est le nom d'un processus, la regex devrait matcher tout nom de fichier légal sous Linux (au moins selon POSIX 3.278 Portable Filename Character Set). Il faudrait ajouter en principe l'underscore et les chiffres donc
[\w-]
(\w signifie "Any word character (letter, number, underscore)").

En fait, tu peux tout faire avec une seule regexp sur ta ligne lue :

^([a-zA-Z]+\s\d+\s\d{2}:\d{2}:\d{2})\s[\S]+\s([\w-]+)\[([\d]+)\]:.*for user ([\S]+) by.*$


va matcher les lignes de log et récupérer :

- en $1 : Jan 27 12:35:34
- en $2 : su
- en $3 : 2048
- en $4 : root


Dal
0