PowerShell setara dengan grep -f


157

Saya mencari PowerShell yang setara dengan grep --file=filename. Jika Anda tidak tahu grep, nama file adalah file teks di mana setiap baris memiliki pola ekspresi reguler yang ingin Anda cocokkan.

Mungkin saya kehilangan sesuatu yang jelas, tetapi Select-Stringsepertinya tidak memiliki opsi ini.

Jawaban:


178

The -Patternparameter dalam Select-Stringmendukung berbagai pola. Jadi yang Anda cari adalah:

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

Ini mencari melalui file teks doc.txtdengan menggunakan setiap regex (satu per baris) diregex.txt


6
Selain itu, penyelesaian tab PowerShell akan membuat perintah menjadi huruf besar dengan benar, sehingga tidak sulit untuk dimasukkan.
joon

3
@ jooon Beberapa tahun terlambat, tapi saya akan menambahkan bahwa Powershell adalah case-sensitive sehingga kapitalisasi perintah tidak menjadi masalah.
dee-see

1
@ Vache tentu saja - Saya pikir komentar saya di atas adalah balasan untuk komentar lain, tetapi sepertinya komentar itu sudah hilang.
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
Saya tidak pernah mengerti bagaimana ini mendapat begitu banyak suara. Itu bahkan tidak menjawab pertanyaan ..
Frode F.

18
Apa yang saya sukai dari jawaban ini adalah yang findstrpaling berfungsi grepdi Linux. Select-Stringbagus untuk bekerja dengan objek, tetapi kadang-kadang Anda hanya ingin mencocokkan string.
Elijah W. Gagne

7
Perlu dicatat bahwa findstrini bukan asli PowerShell, tetapi Command Prompt.
anishpatel

1
Perintah findstr ini sudah tersedia untuk saya, dan itu berfungsi seperti halnya unix GREP.
Lennon

37

Saya tidak terbiasa dengan grep tetapi dengan Select-String yang dapat Anda lakukan:

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

Anda juga dapat melakukannya dengan Get-Content:

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

4
Perluas ini misalnya dir *.cs -Recurse | sls "TODO" | select -Unique "Path". Terima kasih untuk pointer yang sangat baik.
Jeroen

4

Jadi saya menemukan jawaban yang cukup bagus di tautan ini: https://www.thomasmaurer.ch/2011/03/powershell-search-for-string-or-grep-for-powershell/

Tetapi pada dasarnya itu adalah:

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

Ini memberikan pencarian file direktori (* atau Anda bisa menentukan file) dan pencarian konten file semua dalam satu baris PowerShell, sangat mirip dengan grep. Outputnya akan mirip dengan:

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

1
Dia ingin memuat pola dari file.
Brian Gordon

2

Pertanyaan ini sudah memiliki jawaban, tetapi saya hanya ingin menambahkan bahwa di Windows ada Windows Subsystem untuk Linux WSL .

Jadi misalnya jika Anda ingin memeriksa apakah Anda memiliki layanan bernama Elasicsearch yang dalam status sedang berjalan, Anda dapat melakukan sesuatu seperti cuplikan di bawah di PowerShell

net start | grep Elasticsearch


2

Saya memiliki masalah yang sama mencoba menemukan teks dalam file dengan PowerShell. Saya menggunakan yang berikut - untuk tetap sedekat mungkin dengan lingkungan Linux.

Semoga ini membantu seseorang:

PowerShell:

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

Penjelasan:

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)

Ya, ini juga berfungsi:

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

0

tetapi select-String tampaknya tidak memiliki opsi ini.

Benar. PowerShell tidak tiruan dari toolset * nix shells '.

Namun tidak sulit untuk membangunnya sendiri:

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

Ini jawaban yang buruk. Select-String -Pattern somestringjauh lebih bersih
Kolob Canyon

0

Mungkin?

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

Get-Content <filespec> -ReadCount 10000 |
 foreach {
           if ($_ -match $regex)
             {
              $true
              break
             }
         }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.