Question
Récupérer plusieurs chaine de caractères
- joris
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 3
- Remerciements reçus 0
J'ai un dossier contenant plusieurs fichiers de logs.
J'ai créé un petit script tout simple qui me permet de récupérer chaque ligne contenant une adresse MAC particulière.
Pour information, ce sont des logs de firewall.
[code:1]# Récuperations de tous les fichiers
$files=(Get-ChildItem -Path \"C:\Users\johndoe\Desktop\LOGS_STORMSHIELD\Juillet\" -Recurse)
#Boucle pour lecture de chaque fichier
foreach($file in $files){
Get-Content $file | Select-String -Pattern '48:0f:ab:7e:16:5a' >> RAPPORT.log
}[/code:1]
Je me retrouve donc avec un fichier RAPPORT.log qui contient toutes les lignes (+ de 100.000) qui m'intéresse. Cependant, je ne souhaite pas toute la ligne complète mais seulement quelques informations. Ci-dessous, un extrait d'une ligne en question :
id=firewall time=\"2019-06-30 19:52:46\" fw=\"SN510\" tz=+0200 startime=\"2019-06-30 19:51:45\" pri=5 confid=01 slotlevel=2 ruleid=35 srcif=\"Ethernet1\" srcifname=\"in\" ipproto=tcp dstif=\"Ethernet6\" dstifname=\"out_FIBRE\"
proto=ssl src=192.168.1.126 srcport=49292 srcportname=ephemeral_fw_tcp srcmac=48:0f:ab:7e:16:5a dst=40.77.226.250 dstport=443 dstportname=https dstname=vortex-win.data.microsoft.com dstcontinent=\"eu\" dstcountry=\"ie\"
modsrc=105.105.3.10 modsrcport=20560 origdst=40.77.226.250 origdstport=443 ipv=4 sent=1189 rcvd=4135 duration=0.43 action=pass
Je souhaiterai tout simplement avoir l'information suivante : dstname=vortex-win.data.microsoft.com
Le but étant de me retrouver avec un fichier de log assez propre ou une ligne est égale au champ \"dstname\".
Pour information, j'ai trouvé l'expression régulière qui match ça : dstname=[a-z0-9\/:%_+.,#?!@&=-]+
Mais je me trouve bloqué, je n'arrive plus à avancer dessus, d'où ce post sur ce forum
En vous en remerciant par avance !
Message édité par: sneakiz, à: 20/08/19 16:03<br><br>Message édité par: sneakiz, à: 20/08/19 16:23
Connexion ou Créer un compte pour participer à la conversation.
- Hicham Madini
- Hors Ligne
- Membre premium
- Messages : 98
- Remerciements reçus 0
donc si on veux récupérer les dstname du fchier RAPPORT.log
[code:1]$workdir = \"C:\Users\johndoe\Desktop\LOGS_STORMSHIELD\" # ici il faut adapter le chemin du fichier log
$Txt = \"$workdir\RAPPORT.log\"
Function GetDstName($rTxt)
{
$captures = gc $rTxt |
select-string -Pattern '(?<=dstname=)([a-z0-9/:%_+.,#?!@&=-]+)' -allmatches |
select -expa matches | select -expa value
Set-Content -path $workdir\Output.txt -value $captures
}
GetDstName $Txt[/code:1]
Output:
vortex-win.data.microsoft.com
vortex1-win.data.microsoft.com
vortex2-win.data.microsoft.com
vortex3-win.data.microsoft.com
vortex4-win.data.microsoft.com
sinon comme ca
[code:1]$workdir = \"C:\Users\johndoe\Desktop\LOGS_STORMSHIELD\" # ici il faut adapter le chemin du fichier log
$Txt = \"$workdir\RAPPORT.log\"
Function GetDstName($rTxt)
{
$captures = gc $rTxt |
select-string -Pattern 'dstname=[a-z0-9/:%_+.,#?!@&=-]+' -allmatches |
select -expa matches | select -expa value
Set-Content -path $workdir\Output.txt -value $captures
}
GetDstName $Txt[/code:1]
Output:
<br><br>Message édité par: hichammadd, à: 20/08/19 22:47dstname=vortex-win.data.microsoft.com
dstname=vortex1-win.data.microsoft.com
dstname=vortex2-win.data.microsoft.com
dstname=vortex3-win.data.microsoft.com
dstname=vortex4-win.data.microsoft.com
Connexion ou Créer un compte pour participer à la conversation.
- joris
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 3
- Remerciements reçus 0
C'est parfait !!! Un grand merci à toi.
Je suis pas encore assez bon pour pondre un truc pareil
J'essaye d'améliorer un peu.
Comment faire pour récupérer la date et heure avec mon dstname ?
J'aimerai aussi, si ce n'est pas trop complexe, compter le nombre d'occurences similaires dans le but d'avoir un autre fichier de log de la sorte :
vortex.microsoft.com 19
(où le 19 est le nombre de fois où cette URL apparaît)
Un grand merci à toi en tout cas ! Bonne journée
Connexion ou Créer un compte pour participer à la conversation.
- joris
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 3
- Remerciements reçus 0
[code:1]Get-Content .\RAPPORT_URL.log | Group-Object -NoElement > $workdir\RAPPORT_STATS_URL.log[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
sneakiz écrit:
Si l'exemple donné contient tous les cas possible, il faut ajouter un autre 'ancrage' dans la regex :Comment faire pour récupérer la date et heure avec mon dstname ?
[code:1]
$r='.*? time=\"(?<Time>.*?)\".*? dstname=(?<dstName>[a-z0-9/:%_+.,#?!@&=-]+)'
$s -match $r
$matches
[/code:1]
sneakiz écrit:
Lorsque ce type de besoin se présente le mieux, si on peut le faire et si on sait le faire, est de construire des collections d'objets.J'aimerai aussi, si ce n'est pas trop complexe, compter le nombre d'occurences similaires
Ce qui permet ensuite d'utiliser les cmdlets de base XX-Object.
En analysant la structure de ta ligne de log, elle contient une suite de (clé=valeur) séparée par des espaces.
On peut donc envisager ceci comme approche:
[code:1]
#découpe, puis filtre les lignes vide et enfin ajoute un retour chariot
$t=$s -split '(.+?=(?:\"[^\"]*\"|\S*))\s*'|Where-Object {$_ -ne ''}|Out-string
#Converti un texte contenant n lignes (clé=valeur) en une hashtable.
#Celle-ci devient la définition de la 'structure' (propriété) de l'objet.
#La construction \"$t\" dépend du contenu de la variable $OFS, ici on suppose et utilise sa valeur par défaut
$o=[pscustomObject](\"$t\"|ConvertFrom-StringData)
$o
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Hicham Madini
- Hors Ligne
- Membre premium
- Messages : 98
- Remerciements reçus 0
J'aimerai aussi, si ce n'est pas trop complexe, compter le nombre d'occurences similaires dans le but d'avoir un autre fichier de log de la sorte :
vortex.microsoft.com 19
(où le 19 est le nombre de fois où cette URL apparaît)
[code:1]$workdir = \"C:\Users\johndoe\Desktop\LOGS_STORMSHIELD\" # ici il faut adapter le chemin du fichier log
$Txt = \"$workdir\RAPPORT.log\"
get-content $Txt | % {if($_ -match '(?<=dstname=)([a-z0-9/:%_+.,#?!@&=-]+)') {$($Matches[1])}} | group |
Select-Object -property @{N='DSTName';E={$_.Name}}, @{N='Occurence';E={$_.Count}} |
Out-File -FilePath $workdir\RAPPORT_STATS_URL.log[/code:1]<br><br>Message édité par: hichammadd, à: 22/08/19 02:17
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Récupérer plusieurs chaine de caractères