Extraction de nombre d'une ligne
Résolu
thomas57070
Messages postés
197
Statut
Membre
-
[Dal] Messages postés 6373 Statut Contributeur -
[Dal] Messages postés 6373 Statut Contributeur -
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 !
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:
- Extraction de nombre d'une ligne
- Partage de photos en ligne - Guide
- Nombre de jours entre deux dates excel - Guide
- Mètre en ligne - Guide
- Formulaire en ligne de meta - Guide
- Aller à la ligne excel - Guide
3 réponses
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 :
Si ce que tu veux, en fait, c'est ne garder que "CRON", tu fais comme cela :
Dal
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
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
C'est bon j'ai légèrement modifié la commande
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.
$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.
Exemple de ligne qui ne posait pas de problème :
Ligne récalcitrantes j'ai mis en gras ce qui m'embêter :
au final maintenant c'est bon je fais :
au final après quelques split j'arrive à :
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
Salut, cool, bravo !
Sinon, dans tes crochets de définition de la classe de caractères
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
En fait, tu peux tout faire avec une seule regexp sur ta ligne lue :
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
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