grep --file=filename
相等的命令。如果您不了解grep
,则filename是一个文本文件,其中每行都有一个正则表达式模式,您想要匹配它们。
也许我错过了一些明显的东西,但是Select-String
似乎没有这个选项。
grep --file=filename
相等的命令。如果您不了解grep
,则filename是一个文本文件,其中每行都有一个正则表达式模式,您想要匹配它们。
也许我错过了一些明显的东西,但是Select-String
似乎没有这个选项。
Select-String
中,-Pattern
参数支持模式数组。因此,你要找的是:Get-Content .\doc.txt | Select-String -Pattern (Get-Content .\regex.txt)
regex.txt
中的每个正则表达式(每行一个)来搜索文本文件doc.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
的工作方式最像 Linux 上的 grep
。 Select-String
适用于处理对象,但有时你只需要匹配字符串。 - Elijah W. Gagnefindstr
不是 PowerShell 的本地命令,而是命令提示符的命令。 - anishpatel虽然我不熟悉 grep,但使用 Select-String 您可以做到:
Get-ChildItem filename.txt | Select-String -Pattern <regexPattern>
你也可以使用 Get-Content 来实现这个功能:
(Get-Content filename.txt) -match 'pattern'
dir *.cs -Recurse | sls "TODO" | select -Unique "Path"
。感谢这个很好的指示。 - Jeroensls
,这样写起来更快。 - рüффп我曾经在使用PowerShell查找文件中的文本时遇到了相同的问题。为了尽可能接近Linux环境,我使用了以下命令。
希望这能对某些人有所帮助:
PowerShell:
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"
cat
会丢失这些信息并将所有内容转换为字符串。
你可以运行以下命令来实现你所需的功能:ls -r *.txt | select-string -pattern "some text" | Format-Table LineNumber, Filename, Line
。
同样的命令,使用别名:ls -r *.txt | sls -pattern "some text" | ft LineNumber, Filename, Line
。 - Serjcat
会丢失该信息并将所有内容转换为字符串。
您可以运行以下命令来实现所需的功能 ls -r *.txt | select-string -pattern "some text" | Format-Table LineNumber, Filename, Line
。
使用别名的相同命令:ls -r *.txt | sls -pattern "some text" | ft LineNumber, Filename, Line
。 - Serj所以我在这个链接中找到了一个相当不错的答案: 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
我发现PowerShell中的“filter”和“alias”可能是一种在管道输出中使用grep的方法(grep文件应该是类似的):
首先定义一个过滤器:
filter Filter-Object ([string]$pattern) {
Out-String -InputObject $_ -Stream | Select-String -Pattern "$pattern"
}
然后定义别名:
New-Alias -Name grep -Value Filter-Object
最后,在你的个人资料中加入前面的筛选器和别名:
$Home[My ]Documents\PowerShell\Microsoft.PowerShell_profile.ps1
重新启动您的PS,这样就可以使用它了:
alias | grep 'grep'
参考文献
net start | grep Elasticsearch
。$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
更加简洁。 - Kellen Stuart可能吗?
[regex]$regex = (get-content <regex file> |
foreach {
'(?:{0})' -f $_
}) -join '|'
Get-Content <filespec> -ReadCount 10000 |
foreach {
if ($_ -match $regex)
{
$true
break
}
}