2013-03-04 42 views
94

Tôi đang tìm PowerShell tương đương với grep --file=filename. Nếu bạn không biết grep, tên tệp là tệp văn bản trong đó mỗi dòng có mẫu biểu thức chính quy bạn muốn đối sánh.PowerShell tương đương với grep -f

Có thể tôi thiếu điều gì đó hiển nhiên, nhưng Select-String dường như không có tùy chọn này.

Trả lời

103

Tham số -Pattern trong Select-String hỗ trợ n mảng các mẫu. Vì vậy, một trong những bạn đang tìm kiếm là:

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

này tìm kiếm thông qua các textfile doc.txt bằng cách sử dụng tất cả các regex (mỗi dòng một) trong regex.txt

+0

Cảm ơn - điều này có ý nghĩa nhất đối với tôi. – Fordio

+5

Ngoài ra, hoàn thành tab PowerShell sẽ làm cho các lệnh được viết hoa đúng cách, do đó không khó nhập vào. – joon

+0

@joon Một vài năm trễ, nhưng tôi muốn nói rằng Powershell là trường hợp không nhạy cảm nên viết hoa của các lệnh không phải là một vấn đề. – Vache

1

nhưng chọn-chuỗi dường như không có tùy chọn này.

Đúng. PowerShell là không một bản sao của bộ công cụ vỏ * nix.

Tuy nhiên nó không phải là khó khăn để xây dựng một cái gì đó giống như nó tự hỏi:

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

Tôi không quen thuộc với grep nhưng với Select-String bạn có thể làm:

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

Bạn cũng có thể làm với Get-Content:

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

Mở rộng điều này thành ví dụ: 'dir * .cs -Recurse | sls "TODO" | chọn -Unique "Path" '. Thx cho con trỏ tuyệt vời. – Jeroen

1

lẽ?

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

Get-Content <filespec> -ReadCount 10000 | 
foreach { 
      if ($_ -match $regex) 
      { 
       $true 
       break 
      } 
     } 
50
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 /? 
+5

Tôi chưa bao giờ hiểu điều này có quá nhiều phiếu bầu. Nó thậm chí không trả lời câu hỏi .. –

+5

Điều tôi thích về câu trả lời này là 'findstr' hoạt động giống như' grep' nhất trên Linux. 'Select-String' là lựa chọn tuyệt vời để làm việc với các đối tượng, nhưng đôi khi bạn chỉ muốn khớp trên các chuỗi. –

+2

Điều đáng lưu ý là 'findstr' không phải là bản địa của PowerShell, mà là Command Prompt. – anishpatel

3

Vì vậy, tôi tìm thấy một câu trả lời khá tốt tại liên kết này: https://www.thomasmaurer.ch/2011/03/powershell-search-for-string-or-grep-for-powershell/

Nhưng về cơ bản nó là:

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

Điều này cho phép tìm kiếm tập tin thư mục (* hoặc bạn có thể chỉ cần chỉ định một tệp) và tìm kiếm nội dung tệp tất cả trong một dòng của PowerShell, rất giống với grep. Đầu ra sẽ tương tự như:

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

Anh ấy muốn tải mẫu từ một tệp. –

Các vấn đề liên quan