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 6203 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 29 janvier 2025 - 31 janv. 2014 à 10:33
[Dal] Messages postés 6203 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 29 janvier 2025 - 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 !
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
- Site de vente en ligne particulier - Guide
- Aller à la ligne excel - Guide
- Extraction video youtube - Guide
- Apparaitre hors ligne instagram - Guide
3 réponses
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
29 janv. 2014 à 09:52
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 :
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
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
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
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
29 janv. 2014 à 10:39
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.
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
29 janv. 2014 à 13:49
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
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
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
Modifié par thomas57070 le 31/01/2014 à 09:53
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
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
31 janv. 2014 à 10:33
31 janv. 2014 à 10:33
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