PowerShell : rechercher une chaîne de caractères avec Select-String

malekalmorte

Création :

18 février 2023

Modification :

En CMD, vous pouvez chercher une chaîne de caractère avec findstr, sur Linux, il existe la commande grep.
PowerShell ne déroge pas et permet lui aussi de rechercher une chaîne de caractère avec Select-String.
Dans ce tutoriel, je vous montre comment utiliser le cmdlet Select-String pour rechercher une chaîne de caractères en Powershell.
Vous trouverez plusieurs exemples, de la recherche d’un motif texte à une utilisation plus avancées avec des expressions régulières (regex).

PowerShell : rechercher une chaîne de caractères avec Select-String

Quelle est la syntaxe de la commande Select-String

L’applet Select-String de commande (équivalent de grep en PowerShell) travaille sur des lignes de texte et, par défaut, recherche la première correspondance dans chaque ligne, puis affiche le nom du fichier, le numéro de ligne et le texte de la ligne correspondante.

La syntaxe basique est :

Select-String -Pattern <Motif à chercher>

Mais de nombreuses options sont disponibles dont voici la liste :

ParamètresDescription
AllMatchesChercher plus d’une correspondance. Un seul objet MatchInfo sera toujours émis pour chaque ligne,
mais il contiendra toutes les correspondances trouvées
CaseSensitiveLes correspondances ne sont pas sensibles à la casse par défaut, ce qui oblige le cmdlet à
rechercher les correspondances qui correspondent exactement au modèle d’entrée
ContexteDéfinir le nombre de lignes avant et après la correspondance qui seront affichées. L’ajout de
ce paramètre modifie l’objet MatchInfo émis pour inclure une nouvelle propriété Context qui
contient les lignes spécifiées
CultureSpécifier une culture à faire correspondre avec le motif spécifié. Cela inclut des options telles que en-US,
es, ou fr-FR par exemple. D’autres options utiles sont les options Ordinal et Invariant. Ordinal permet
d’effectuer des comparaisons binaires non linguistiques et Invariant permet d’effectuer des
comparaisons indépendantes de la culture
EncodingSpécifier l’encodage du fichier cible à rechercher : ascii, bigendianunicode, oem, unicode, utf7, utf8,
utf8BOM, utf8NoBOM, utf32, windows-1251, …
ExcludeEn utilisant le paramètre Path, excluez des éléments spécifiques en utilisant un modèle, tel que *.txt
IncludePour inclure un élément. Fonctionne de la même manière que Exclude
ListRenvoyer uniquement la première instance du texte correspondant de chaque fichier d’entrée.
Il s’agit d’un moyen rapide et efficace de récupérer une liste de fichiers dont le contenu correspond
LiteralPathIndiquer à Select-String d’utiliser les valeurs en entrée, au lieu d’interpréter des valeurs telles que * comme un caractère générique.
Si le chemin comprend des caractères d’échappement, mettez-les entre guillemets simples pour ne pas les interpréter
NoEmphasisAu lieu de mettre en évidence la chaîne de caractères sur laquelle le motif est apparié,
désactivez la mise en évidence des correspondances. Par défaut, la mise en évidence utilise des
couleurs négatives basées sur les couleurs du texte d’arrière-plan
NotMatchRechercher le texte qui ne correspond pas au motif spécifié.
PathSpécifier le chemin d’accès aux fichiers à rechercher. Les caractères génériques sont autorisés,
mais vous ne pouvez pas spécifier uniquement un répertoire. La valeur par défaut est le répertoire local
PatternLe motif à rechercher dans le contenu ou les fichiers d’entrée en fonction de RegEx
SimpleMatchUtiliser une correspondance simple au lieu des expressions régulières
RawAfficher les chaînes de caractères correspondantes, sans objet MatchInfo. C’est le comportement
qui ressemble le plus à grep et non à la nature plus orientée objet de PowerShell
QuietRenvoie uniquement un $true ou $false si le motif est trouvé
Les options et paramètres de la commande Select-String

Comment rechercher une chaîne de caractères en PowerShell avec des exemples

Utilisation basique

Voici un exemple simple de recherche de chaîne de caractères.
On passe à la phrase à la commande Select-String grâce au caractère Pipe « | ».

"J'aime Malekal car c'est un site où j'apprends des choses."|Select-String -Pattern "malekal"

Ici l’occurrence est trouvée, on voit donc que Select-String est insensible à la casse.

Vous pouvez aussi créer une variable, pour la passer à la commande Select-String.
Le résultat est le même.

$string="J'aime Malekal car c'est un site où j'apprends des choses.`r`nMerci pour tous."
Write-Host $string
$string|Select-String -Pattern "malekal"
Comment rechercher une chaîne de caractères en PowerShell avec des exemples

Notez que l’on peut aussi utiliser l’option InputObject pour recherche du texte dans une variable :

Select-String -pattern "Malekal" -InputObject $string

Rechercher une correspondance dans les fichiers

Vous pouvez aussi rechercher des motifs dans les fichiers.
Pour cela, il faut utiliser le paramètre -Path.
Spécifiez alors le chemin complet d’un fichier ou utiliser le caractère joker pour rechercher dans plusieurs fichiers, par exemple sur une extension spécifique.

Par exemple, pour rechercher le motif Pierre dans tous les fichiers CSV du bureau.

Select-String -Path "C:\Users\Mak\Desktop\*.csv" -Pattern "Pierre"

Le nom du fichier et le numéro de ligne s’affichent suivis par la ligne contenant la chaîne de caractères trouvée.

Rechercher une chaîne de caractères dans les fichiers en PowerShell

Une autre façon de procéder pour rechercher un motif dans les fichiers est d’utiliser le cmdlet Get-ChildItem.
Par exemple pour rechercher le mot Microsoft dans tous les fichiers texte du répertoire system32.

Get-ChildItem -Path C:\Windows\System32\*.txt | Select-String -Pattern 'Microsoft'
Rechercher une chaîne de caractères dans les fichiers en PowerShell

Rechercher un motif dans une arborescence complète (récursif)

On peut aussi avoir besoin de rechercher un motif dans un répertoire complet comprenant les sous-répertoire.
Pour effectuer une recherche de chaîne de caractères en récursif, ajoutez l’option -Recurse au cmdlet Get-ChildItem.

Par exemple, pour chercher le mot Microsoft dans TOUS les fichiers texte du dossier system32, y compris, les sous-répertoire :

Get-ChildItem -Path C:\Windows\System32\*.txt -Recurse | Select-String -Pattern 'Microsoft' -CaseSensitive
Rechercher une chaîne de caractères dans une arborescence complète (récursif) en PowerShell

Si vous devez chercher sur tout un disque, utilisez -Filter pour filtrer sur un type de fichiers.
Par exemple ci-dessous, on recherche sur tout le disque C les fichiers contenant le mot Microsoft.

Get-ChildItem -Recurse C:\ -Filter *.log -ErrorAction SilentlyContinue -ev errs | 
  Select-String -Pattern 'Microsoft' -SimpleMatch

Rechercher une correspondance respectant la casse

Nous l’avons vu précédemment, la commande Select-String est insensible à la casse comme c’est le cas de tous les commandes de Windows et du système en général.
Si vous devez chercher un motif en étant sensible à la casse, ajoutez l’option -CaseSensitive :

'Malekal', 'MALEKAL' | Select-String -Pattern 'MALEKAL' -CaseSensitive -SimpleMatch
Rechercher une chaîne de caractères respectant la casse en PowerShell

Rechercher des lignes avant et après une correspondance

Vous pouvez aussi obtenir les lignes avant et après le modèle correspondant.
Pour cela, utilisez le paramètre -Context avec la valeur avant et la valeur après séparés par une virgule.

Select-String -Path "C:\Users\Mak\Desktop\*.csv" -Pattern 'Pierre' -Context 2, 3

Le paramètre Context utilise deux valeurs, avant et après, et marque les correspondances de modèle dans la sortie avec un crochet d’angle (>). Le paramètre Context génère les deux lignes avant la première correspondance de modèle et trois lignes après la dernière correspondance de modèle.

Rechercher des lignes avant et après une correspondance en PowerShell

Trouver les X premières occurrences

Parfois le nombre d’occurrence trouvée est importante et on peut être intéresser à capturer que les premières.
Pour trouver les X premières occurrences, vous pouvez utiliser le cmdlet Select-Object et son option -First en spécifiques le nombre.

Par exemple pour afficher que les 10 premières occurrences trouvées :

Get-ChildItem -Path C:\Windows\System32\*.txt -Recurse | Select-String -Pattern 'Microsoft'| Select-Object -First 10
Trouver les X premières occurrences en PowerShell

Rechercher plusieurs motifs à la fois

Vous pouvez aussi chercher plusieurs chaînes de caractères à la fois.
Pour cela, on sépare les motifs à rechercher par des virgules avec la syntaxe suivante :

Select-String -Path "C:\Users\Mak\Desktop\*.csv" -Pattern "motif1","motif2","motif3"

Par exemple pour trouver toutes les lignes avec soit Pierre, Vincent ou Alice :

Select-String -Path "C:\Users\Mak\Desktop\*.csv" -Pattern "Pierre","Vincent","Alice"
Rechercher plusieurs chaîne de caractères à la fois en PowerShell

Afficher les noms de fichiers, lignes des occurrences

Toujours en utilisant le cmdlet Select-Object, vous pouvez changer l’affichage des colonnes de la sortie Select-String.
Par exemple, si vous voulez afficher une colonne avec le nom du fichier, Pattern et la ligne trouvé, utilisez la syntaxe suivante :

Select-String -Path "C:\Users\Mak\Desktop\*.csv" -Pattern "Pierre","Vincent","Alice","St.phanie" | Select-Object FileName, Pattern, Line
Afficher les noms de fichiers, lignes des occurrences en PowerShell

Rechercher une correspondance avec des expressions régulières

PowerShell est aussi capable d’effectuer des recherches plus avancées à l’aide d’expressions régulières.

Imaginons que vous souhaitez rechercher que les personnes dont la date de naissance a pour année 86.
Vous pouvez alors chercher avec la regex suivante :

Select-String -Path "C:\Users\Mak\Desktop\*.csv" -Pattern '\d\d/\d\d/86'
Rechercher une correspondance avec des expressions régulières en PowerShell

Et si vous voulez chercher sur des adresses IP, utilisez le regex suivant :

Select-String -Path "C:\Users\Mak\Desktop\*.txt" -Pattern '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b' | Select-Object -First 10
Rechercher une correspondance avec des expressions régulières en PowerShell

Résoudre les problèmes d’accents dans la recherche de chaîne de caractères

Un problème courant qui peut se produire dans la recherche de chaîne de caractères en PowerShell est le problème d’accents.
Bien souvent, l’accent ne s’affiche pas correctement et donc la recherche de motif ne fonctionne pas.
Cela vient en général d’un problème d’encodage du fichier.
Vous pouvez corriger et résoudre le problème d’accent avec Select-String en utilisant l’option -Encoding et en spécifiant le bon encodage.

Dans cet exemple, on voit que l’accent s’affiche mal mais si on change l’encodage, l’accent s’affiche comme il faut et Select-String le prend bien en compte dans la recherche de motif.

Select-String -Path "Desktop\*.csv" -Pattern "Stéphanie" -Encoding utf7 | Select-Object FileName, Pattern, Line
Résoudre les problèmes d'accents dans la recherche de chaîne de caractères en PowerShell

A propros de malekalmorte

malekal-site-logo-150

Passionné par l'informatique depuis très jeune, j'aide les internautes sur les forums depuis 2005 pour résoudre leurs tracas informatiques.
Je vous propose par la même occasion ce site avec de nombreux tutoriels pour vous aider aussi à résoudre de manière autonome les problèmes informatiques du quotidien.