PowerShell grep -f के बराबर है


157

मैं PowerShell के बराबर देख रहा हूँ grep --file=filename। यदि आप नहीं जानते हैं grep, फ़ाइल नाम एक पाठ फ़ाइल है जहाँ प्रत्येक पंक्ति में एक नियमित अभिव्यक्ति पैटर्न होता है जिसे आप मिलान करना चाहते हैं।

शायद मुझे कुछ स्पष्ट याद आ रहा है, लेकिन Select-Stringयह विकल्प नहीं लगता है।

जवाबों:


178

-Patternमें पैरामीटर Select-Stringका समर्थन करता है पैटर्न की एक सरणी। तो आप जिसे खोज रहे हैं वह है:

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

यह doc.txtप्रत्येक रेगीक्स (प्रति पंक्ति) का उपयोग करके टेक्स्टफाइल के माध्यम से खोज करता हैregex.txt


6
इसके अलावा, PowerShell टैब पूरा होने से कमांड ठीक से कैपिटल में आएंगे, इसलिए इनपुट करना मुश्किल नहीं है।
जून

3
@ जून के कुछ साल देर से, लेकिन मैं कहूंगा कि पॉवर्सशील असंवेदनशील है, इसलिए कमांडों का कैपिटलाइजेशन एक मुद्दा नहीं है।
१e

1
@ निश्चित रूप से - मुझे लगता है कि मेरी टिप्पणी ऊपर एक और टिप्पणी का जवाब है, लेकिन ऐसा लगता है कि टिप्पणी अब चली गई है।
जून

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
मुझे कभी समझ नहीं आया कि इसे इतने वोट कैसे मिले। यह भी सवाल का जवाब नहीं है ..
फ्रोड एफ।

18
मुझे इस उत्तर के बारे में जो पसंद है वह यह है कि लिनक्स पर findstrसबसे अधिक काम grepकरता है। Select-Stringवस्तुओं के साथ काम करने के लिए महान है, लेकिन कभी-कभी आप केवल तारों पर मेल खाना चाहते हैं।
एलिजा डब्ल्यू। गगन

7
यह ध्यान देने योग्य है कि findstrPowerShell के मूल निवासी नहीं हैं, लेकिन कमांड प्रॉम्प्ट।
अनीशपेटेल

1
यह खोज कमांड मुझे पहले से ही उपलब्ध था, और यह यूनिक्स जीआरपी की तरह ही काम करता था।
लेनन

37

मैं grep से परिचित नहीं हूँ लेकिन Select-String के साथ आप कर सकते हैं:

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

आप गेट-कंटेंट के साथ भी ऐसा कर सकते हैं:

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

4
इसे बढ़ाकर उदा dir *.cs -Recurse | sls "TODO" | select -Unique "Path"। उत्कृष्ट सूचक के लिए Thx।
जेरोइन

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

इस सवाल का पहले से ही एक उत्तर है, लेकिन मैं बस यह जोड़ना चाहता हूं कि विंडोज में लिनक्स डब्ल्यूएसएल के लिए विंडोज सबसिस्टम है ।

इसलिए उदाहरण के लिए यदि आप जाँचना चाहते हैं कि क्या आपके पास Elasicsearch नाम की सेवा है जो स्थिति में चल रही है तो आप कुछ ऐसा कर सकते हैं जैसे कि पॉवरशिप में नीचे स्निपेट है।

net start | grep Elasticsearch


2

मेरे पास एक ही मुद्दा था कि पावरशेल के साथ फाइल में टेक्स्ट खोजने की कोशिश करें। मैंने निम्न का उपयोग किया - जितना संभव हो लिनक्स वातावरण के करीब रहने के लिए।

उम्मीद है कि यह किसी की मदद करता है:

शक्ति कोशिका:

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

लेकिन चयन-स्ट्रिंग में यह विकल्प नहीं है।

सही बात। PowerShell * निक्स शेल्स टूलसेट का क्लोन नहीं है।

हालाँकि यह कुछ बनाने के लिए कठिन नहीं है जैसे कि यह स्वयं:

$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बहुत साफ है
कोलब कैन्यन

0

शायद?

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

Get-Content <filespec> -ReadCount 10000 |
 foreach {
           if ($_ -match $regex)
             {
              $true
              break
             }
         }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.