Question Récupérer plusieurs chaine de caractères

Plus d'informations
il y a 4 ans 8 mois #29203 par joris
Bonjour,

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 :whistle:

En vous en remerciant par avance ! :woohoo:

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.

Plus d'informations
il y a 4 ans 8 mois #29204 par Hicham Madini
Salut Sneakiz,

donc si on veux récupérer les dstname du fchier RAPPORT.log

[code:1]$workdir = \&quot;C:\Users\johndoe\Desktop\LOGS_STORMSHIELD\&quot; # ici il faut adapter le chemin du fichier log
$Txt = \&quot;$workdir\RAPPORT.log\&quot;
Function GetDstName($rTxt)
{
$captures = gc $rTxt |
select-string -Pattern '(?&lt;=dstname=)([a-z0-9/:%_+.,#?!@&amp;=-]+)' -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 = \&quot;C:\Users\johndoe\Desktop\LOGS_STORMSHIELD\&quot; # ici il faut adapter le chemin du fichier log
$Txt = \&quot;$workdir\RAPPORT.log\&quot;
Function GetDstName($rTxt)
{
$captures = gc $rTxt |
select-string -Pattern 'dstname=[a-z0-9/:%_+.,#?!@&amp;=-]+' -allmatches |
select -expa matches | select -expa value
Set-Content -path $workdir\Output.txt -value $captures
}

GetDstName $Txt[/code:1]

Output:

dstname=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

<br><br>Message édité par: hichammadd, à: 20/08/19 22:47

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 8 mois #29205 par joris
Salut,

C'est parfait !!! Un grand merci à toi.
Je suis pas encore assez bon pour pondre un truc pareil :S

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 B)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 8 mois #29206 par joris
C'est bon j'ai réussi à me retrouver avec un fichier contenant mes URL avec le nombre d'occurrences.



[code:1]Get-Content .\RAPPORT_URL.log | Group-Object -NoElement &gt; $workdir\RAPPORT_STATS_URL.log[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 8 mois #29207 par Laurent Dardenne
Salut,
sneakiz écrit:

Comment faire pour récupérer la date et heure avec mon dstname ?

Si l'exemple donné contient tous les cas possible, il faut ajouter un autre 'ancrage' dans la regex :
[code:1]
$r='.*? time=\&quot;(?&lt;Time&gt;.*?)\&quot;.*? dstname=(?&lt;dstName&gt;[a-z0-9/:%_+.,#?!@&amp;=-]+)'
$s -match $r
$matches
[/code:1]

sneakiz écrit:

J'aimerai aussi, si ce n'est pas trop complexe, compter le nombre d'occurences similaires

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.
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 '(.+?=(?:\&quot;[^\&quot;]*\&quot;|\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 \&quot;$t\&quot; dépend du contenu de la variable $OFS, ici on suppose et utilise sa valeur par défaut
$o=[pscustomObject](\&quot;$t\&quot;|ConvertFrom-StringData)
$o
[/code:1]

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 ans 8 mois #29208 par Hicham Madini
sneakiz écrit:

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 = \&quot;C:\Users\johndoe\Desktop\LOGS_STORMSHIELD\&quot; # ici il faut adapter le chemin du fichier log
$Txt = \&quot;$workdir\RAPPORT.log\&quot;

get-content $Txt | % {if($_ -match '(?&lt;=dstname=)([a-z0-9/:%_+.,#?!@&amp;=-]+)') {$($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.

Temps de génération de la page : 0.076 secondes
Propulsé par Kunena