215 votes

Équivalent PowerShell de grep -f

Je cherche l'équivalent PowerShell de grep --file=filename . Si vous ne savez pas grep Le nom de fichier est un fichier texte dont chaque ligne contient un modèle d'expression régulière que vous souhaitez faire correspondre.

Peut-être que je rate quelque chose d'évident, mais Select-String ne semble pas avoir cette option.

233voto

Frode F. Points 12953

Le site -Pattern dans Select-String prend en charge un ensemble 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 chaque regex (une par ligne) dans regex.txt

8 votes

De plus, la complétion de tabulation PowerShell met les commandes en majuscules, ce qui facilite la saisie.

4 votes

@joon Quelques années de retard, mais j'ajouterais que Powershell n'est pas sensible à la casse, donc la capitalisation des commandes n'est pas un problème.

1 votes

@Vache bien sûr - Je pense que mon commentaire ci-dessus est une réponse à un autre commentaire, mais il semble que le commentaire n'existe plus.

124voto

dawciobiel Points 109
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 /?

29 votes

Je n'ai jamais compris comment cela a obtenu autant de votes. Ca ne répond même pas à la question

28 votes

Ce que j'aime dans cette réponse, c'est que findstr fonctionne le plus comme grep sur Linux le fait. Select-String est idéal pour travailler avec des objets, mais il arrive que l'on veuille simplement faire correspondre des chaînes de caractères.

10 votes

Il convient de noter que findstr n'est pas originaire de PowerShell, mais de Command Prompt.

49voto

Shay Levy Points 41404

Je ne suis pas familier avec grep mais avec Select-String vous pouvez le faire :

Get-ChildItem filename.txt | Select-String -Pattern <regexPattern>

Vous pouvez également le faire avec Get-Content :

(Get-Content filename.txt) -match 'pattern'

6 votes

Etendre cela à par exemple dir *.cs -Recurse | sls "TODO" | select -Unique "Path" . Merci pour cette excellente indication.

0voto

mjolinor Points 23012

Peut-être ?

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

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

0voto

Richard Points 54016

mais select-String ne semble pas avoir cette option.

Correct. PowerShell est pas un clone de la boîte à outils des shells *nix.

Cependant, il n'est pas difficile de construire quelque chose de semblable soi-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
}

1 votes

C'est une mauvaise réponse. Select-String -Pattern somestring est beaucoup plus propre

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X