私はgrep --file=filename
と同等のPowerShellを探しています。 grep
がわからない場合、filenameは各行に一致させたい正規表現パターンがあるテキストファイルです。
明らかなものが欠けているかもしれませんが、Select-String
にはこのオプションがないようです。
-Pattern
のSelect-String
パラメータはパターンの配列をサポートします。だからあなたが探しているのは、
Get-Content .\doc.txt | Select-String -Pattern (Get-Content .\regex.txt)
これはdoc.txt
内のすべての正規表現(1行に1つ)を使ってテキストファイル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 /?
私はgrepには馴染みがありませんが、Select-Stringを使えば以下のことができます。
Get-ChildItem filename.txt | Select-String -Pattern <regexPattern>
Get-Contentでもそれが可能です。
(Get-Content filename.txt) -match 'pattern'
だから私はこのリンクでかなり良い答えを見つけました: 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$"
これにより、ディレクトリファイル検索(*または単にファイルを指定できます)とファイル内容検索がすべて1行のPowerShellで行われます。これはgrepと非常によく似ています。出力は次のようになります。
doc.txt:31: Enter REGEX Here
HelloWorld.txt:13: Enter REGEX Here
この質問にはすでに答えがありますが、私はWindowsにLinux用のWindows Subsystem WSL があることを付け加えたいと思います。
たとえば、Elasicsearchという名前のサービスが実行中になっているかどうかを確認したい場合は下記のスニペットのようなことをPowerShellで実行できます
net start | grep Elasticsearch
しかしselect-Stringはこのオプションを持っていないようです。
正しい。 PowerShellはではない * nixシェルのツールセットのクローンです。
しかし、それを自分で作るのは難しくありません。
$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
}
多分?
[regex]$regex = (get-content <regex file> |
foreach {
'(?:{0})' -f $_
}) -join '|'
Get-Content <filespec> -ReadCount 10000 |
foreach {
if ($_ -match $regex)
{
$true
break
}
}