相当于grep -f的PowerShell


157

我正在寻找与等效的PowerShell grep --file=filename。如果您不知道grep,filename是一个文本文件,其中每行都有您要匹配的正则表达式模式。

也许我缺少明显的东西,但Select-String似乎没有此选项。

Answers:


178

中的-Pattern参数Select-String支持模式数组。因此,您要寻找的是:

Get-Content .\doc.txt | Select-String -Pattern (Get-Content .\regex.txt)

这将doc.txt通过使用中的每个正则表达式(每行一个)在文本文件中进行搜索regex.txt


6
另外,PowerShell选项卡补全将使命令正确大写,因此输入也不难。
2014年

3
@joon迟了几年,但是我要补充一点,Powershell不区分大小写,因此命令的大小写不是问题。
dee-见

1
@Vache当然-我想我的上面的评论是对另一个评论的回复,但看来该评论已经消失了。
joon

85
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 /?

17
我从来不明白这是怎么得到这么多选票的。它甚至不回答这个问题..
弗罗德F.

18
我喜欢这个答案的地方是,findstr它最像grepLinux上那样工作。Select-String非常适合使用对象,但是有时您只想匹配字符串。
伊利亚·W·加涅

7
值得注意的是,findstr它不是PowerShell的本机,而是Command Prompt。
anishpatel

1
我已经可以使用这个findstr命令,它的作用就像unix GREP一样。
列侬

37

我对grep并不熟悉,但是可以使用Select-String进行操作:

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

您也可以使用Get-Content来做到这一点:

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

4
扩展到例如dir *.cs -Recurse | sls "TODO" | select -Unique "Path"。Thx是出色的指针。
Jeroen

4

因此,我在此链接上找到了一个很好的答案:https : //www.thomasmaurer.ch/2011/03/powershell-search-for-string-or-grep-for-powershell/

但本质上是:

Select-String -Path "C:\file\Path\*.txt" -Pattern "^Enter REGEX Here$"

这样就可以在PowerShell的一行中进行目录文件搜索(*或您可以只指定一个文件)和文件内容搜索,这与grep非常相似。输出将类似于:

doc.txt:31: Enter REGEX Here
HelloWorld.txt:13: Enter REGEX Here

1
他想从文件中加载模式。
布莱恩·戈登

2

这个问题已经有了答案,但是我只想补充一点,在Windows中有适用于Linux WSL的 Windows子系统。

因此,例如,如果您要检查是否有名为Elasicsearch的服务处于运行状态,则可以在powershell中执行以下代码段

net start | grep Elasticsearch


2

我在尝试使用Powershell在文件中查找文本时遇到了同样的问题。我使用了以下内容-尽可能接近Linux环境。

希望这对某人有帮助:

电源外壳:

PS) new-alias grep findstr
PS) ls -r *.txt | cat | grep "some random string"

说明:

ls       - lists all files
-r       - recursively (in all files and folders and subfolders)
*.txt    - only .txt files
|        - pipe the (ls) results to next command (cat)
cat      - show contents of files comming from (ls)
|        - pipe the (cat) results to next command (grep)
grep     - search contents from (cat) for "some random string" (alias to findstr)

是的,这也可以:

PS) ls -r *.txt | cat | findstr "some random string"

0

但select-String似乎没有此选项。

正确。PowerShell 不是 * nix shells工具集的克隆。

但是,自己构建类似的东西并不难:

$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
}

这是一个不好的答案。Select-String -Pattern somestring更干净
Kolob Canyon

0

也许?

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

Get-Content <filespec> -ReadCount 10000 |
 foreach {
           if ($_ -match $regex)
             {
              $true
              break
             }
         }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.