Je recherche l'équivalent PowerShell de grep --file=filename
. Si vous ne connaissez pas grep
, nom_fichier est un fichier texte dans lequel chaque ligne contient un motif d'expression régulière auquel vous souhaitez correspondre.
Peut-être qu'il me manque quelque chose d'évident, mais Select-String
ne semble pas avoir cette option.
Le paramètre -Pattern
dans Select-String
prend en charge un tableau de motifs. Donc, celui que vous recherchez est:
Get-Content .\doc.txt | Select-String -Pattern (Get-Content .\regex.txt)
Ceci recherche dans le fichier texte doc.txt
en utilisant toutes les expressions rationnelles (une par ligne) dans regex.txt
PS) new-alias grep findstr
PS) C:\WINDOWS> ls | grep -I -N exe
105:-a--- 2006-11-02 13:34 49680 twunk_16.exe
106:-a--- 2006-11-02 13:34 31232 twunk_32.exe
109:-a--- 2006-09-18 23:43 256192 winhelp.exe
110:-a--- 2006-11-02 10:45 9216 winhlp32.exe
PS) grep /?
Je ne suis pas familier avec grep mais avec Select-String, vous pouvez faire:
Get-ChildItem filename.txt | Select-String -Pattern <regexPattern>
Vous pouvez également le faire avec Get-Content:
(Get-Content filename.txt) -match 'pattern'
J'ai donc trouvé une bonne réponse sur ce lien: https://www.thomasmaurer.ch/2011/03/powershell-search-for-string-or-grep-for-powershell/
Mais essentiellement c'est:
Select-String -Path "C:\file\Path\*.txt" -Pattern "^Enter REGEX Here$"
Cela donne une recherche de fichier de répertoire (* ou vous pouvez simplement spécifier un fichier) et une recherche de contenu de fichier sur une seule ligne de PowerShell, très similaire à grep. La sortie sera similaire à:
doc.txt:31: Enter REGEX Here
HelloWorld.txt:13: Enter REGEX Here
Cette question a déjà une réponse, mais je veux juste ajouter que dans Windows, il existe un sous-système Windows pour Linux WSL .
Ainsi, par exemple, si vous souhaitez vérifier si vous avez un service nommé Elasicsearch dont le statut est en cours d'exécution vous pouvez faire quelque chose comme l'extrait ci-dessous dans Powershell
net start | grep Elasticsearch
mais select-String ne semble pas avoir cette option.
Correct. PowerShell est not un clone du jeu d'outils * nix shells.
Cependant, il n'est pas difficile de construire quelque chose comme ça vous-même:
$regexes = Get-Content RegexFile.txt |
Foreach-Object { new-object System.Text.RegularExpressions.Regex $_ }
$fileList | Get-Content | Where-Object {
foreach ($r in $regexes) {
if ($r.IsMatch($_)) {
$true
break
}
}
$false
}
Peut être?
[regex]$regex = (get-content <regex file> |
foreach {
'(?:{0})' -f $_
}) -join '|'
Get-Content <filespec> -ReadCount 10000 |
foreach {
if ($_ -match $regex)
{
$true
break
}
}