web-dev-qa-db-fra.com

PowerShell équivalent à grep -f

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.

136
Fordio

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

154
Frode F.
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 /?
71
dawciobiel

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'
37
Shay Levy

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
3
cody.tv.weber

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

1
Ivan Ruski

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
}
0
Richard

Peut être?

[regex]$regex = (get-content <regex file> |
foreach {
          '(?:{0})' -f $_
        }) -join '|'

Get-Content <filespec> -ReadCount 10000 |
 foreach {
           if ($_ -match $regex)
             {
              $true
              break
             }
         }
0
mjolinor