Câu trả lời:
Các -Pattern
tham số trong Select-String
hỗ trợ một loạt các mô hình. Vì vậy, cái bạn đang tìm kiếm là:
Get-Content .\doc.txt | Select-String -Pattern (Get-Content .\regex.txt)
Điều này tìm kiếm thông qua tệp văn bản doc.txt
bằng cách sử dụng mọi regex (một trên mỗi dòng) trongregex.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 /?
findstr
hoạt động giống như grep
trên Linux. Select-String
là 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 chuỗi.
findstr
là không có nguồn gốc từ PowerShell, nhưng Command Prompt.
Tôi không quen với grep nhưng với Chuỗi chọn bạn có thể làm:
Get-ChildItem filename.txt | Select-String -Pattern <regexPattern>
Bạn cũng có thể làm điều đó với Get-Content:
(Get-Content filename.txt) -match 'pattern'
dir *.cs -Recurse | sls "TODO" | select -Unique "Path"
. Thx cho con trỏ tuyệt vời.
Vì vậy, tôi đã tìm thấy một câu trả lời khá hay tại liên kết này: https://www.thomasmaurer.ch/2011/03/powershell-search-for-opes-or-grep-for-powershell/
Nhưng thực chất 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 thư mục (* hoặc bạn chỉ có thể 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
Câu hỏi này đã có câu trả lời, nhưng tôi chỉ muốn thêm rằng trong Windows có Windows subsystem cho Linux WSL .
Vì vậy, ví dụ nếu bạn muốn kiểm tra xem bạn có dịch vụ có tên Elasicsearch đang trong trạng thái đang chạy hay không, bạn có thể làm một cái gì đó giống như đoạn trích dưới đây trong powershell
net start | grep Elasticsearch
Tôi gặp vấn đề tương tự khi cố gắng tìm văn bản trong các tệp có powershell. Tôi đã sử dụng như sau - để càng gần môi trường Linux càng tốt.
Hy vọng rằng điều này sẽ giúp ai đó:
PowerShell:
PS) new-alias grep findstr
PS) ls -r *.txt | cat | grep "some random string"
Giải trình:
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)
Vâng, điều này cũng hoạt động:
PS) ls -r *.txt | cat | findstr "some random string"
nhưng select-String dường như không có tùy chọn này.
Chính xác. PowerShell không phải là một bản sao của bộ công cụ * nix shells.
Tuy nhiên, không khó để tự xây dựng một cái gì đó giống như nó:
$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
sạch hơn nhiều