Grep PowerShell
-
Cmdlet
Select-String
- Tâche Grep typique utilisant PowerShell
- Utilisation de PowerShell Select-String pour rechercher des modèles
Où allez-vous lorsque vous développez du code PowerShell chaque fois que vous devez rechercher du contenu dans une chaîne ou un fichier texte entier ? Vous connaissez l’utilitaire populaire grep si vous avez beaucoup utilisé Linux. L’utilitaire grep permet aux utilisateurs de rechercher du texte à l’aide de divers paramètres ; cependant, il n’est pas disponible sous Windows. Ainsi, dans ce scénario, nous avons la cmdlet Select-String
dans PowerShell.
Cmdlet Select-String
Select-String
vérifie la correspondance initiale dans chaque ligne par défaut, puis affiche le numéro de ligne, le nom de fichier et le texte appartenant à la ligne correspondante. Select-String
peut également fonctionner avec plusieurs encodages de fichiers, par exemple, du texte Unicode, en déterminant le type d’encodage à l’aide de la marque d’ordre d’octet (BOM). Select-String supposera qu’il s’agit d’un fichier UTF8 si la nomenclature est manquante.
Certaines utilisations de la cmdlet Select-String
sont expliquées ci-dessous.
Tâche Grep typique utilisant PowerShell
Commençons par un exemple. Supposons que nous ayons une chaîne avec des noms et des adresses, et aussi, la chaîne n’est pas structurée. Nous voulons extraire les noms. Alors, comment allons-nous le faire sera expliqué ci-dessous.
||Sara Peiris|| 37, De silva road, Panadura
--||Tim Gangster||-- 345, Yolks street,KL
==|Suz Maker|== 44 Main, Cydney, CA
Le texte ci-dessus est affecté à la variable users
. Donc, avec la tentative, vous chercherez un nom en utilisant le paramètre ‘Pattern’.
test | Select-String -Pattern 'Sara Peiris'
Production :
Ici, nous pouvons comprendre que la méthode Select-String a fonctionné mais n’a pas renvoyé celle spécifiée puisque nous avons passé la chaîne entière. Par conséquent, essayons de passer des lignes simples en sautant en utilisant le caractère de nouvelle ligne puisque chaque entrée spécifique est donnée sur une seule ligne
PS> test = test -split "`n"
PS> test | Select-String -Pattern 'Sara Peiris'
Production :
Ici, nous pouvons voir qu’il renvoie une seule ligne. Ensuite, nous devrions rechercher un moyen de renvoyer plusieurs lignes.
Utilisation de PowerShell Select-String pour rechercher des modèles
Ici, nous devons trouver des motifs communs valables pour toutes les lignes. Donc, si nous reprenons l’exemple précédent, vous pouvez voir que tous les noms sont entourés de |
et les noms sont séparés par un espace. Alors maintenant, prenons ce modèle en utilisant la regex et envoyons-le avec le paramètre -Pattern
.
Select-String
a utilisé la regex pour récupérer chaque ligne ; après cela, je devrai séparer tous les noms. Je n’ai pas besoin des adresses pour chacun en ce moment. Nous utiliserons l’attribut Matches
de chaque objet correspondant renvoyé par Select-String pour accomplir cela.
PS> test | Select-String -Pattern '\|\w+ \w+\|' | foreach {$_.Matches}
Production :
Vous pouvez maintenant voir que l’attribut Value a les noms dont nous avons besoin, mais ils sont toujours entourés du |
personnage. C’est parce que la correspondance de regex incluait le |
caractère dans les noms.
Les caractères de barre verticale doivent toujours être inclus dans le filtre, mais nous ne voulons pas qu’ils soient renvoyés en tant que correspondances. Les groupes Regex sont une méthode. Le résultat que vous souhaitez renvoyer est entouré de parenthèses, qui indiquent des groupes de regex. Dans cette situation, je vais réessayer en joignant la chaîne regex qui représente le prénom et le nom.
PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches}
Production :
Le |
Le caractère est affiché dans la valeur, mais tout ce que nous pouvons voir, le groupe est devenu {0,1}
, ce qui signifie que Select-String a identifié le groupe.
Je vais réinsérer la référence dans le for
de chaque boucle pour voir ce groupe. Étant donné que chaque attribut de groupe est un tableau, nous pouvons faire référence au premier membre en le mettant entre parenthèses, puis en utilisant la propriété Value.
PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches.Groups[1].Value}
Production :
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.