PowerShell下的grep——Select-String详解及⼆者对⽐
tags: []
使⽤ help Select-String -ShowWindow 命令我们可以很容易的得到⼀份中⽂的帮助⽂档,其中有这样两段话:
1. Select-String cmdlet 在输⼊字符串和⽂件中搜索⽂本和⽂本模式。你可以像使⽤ UNIX 中的 Grep 和 Windows 中的 Findstr ⼀样来使⽤它。
可以键⼊“Select-String”或其别名“sls”。
2. Select-String 类似于 UNIX 中的 Grep 命令和 Windows 中的 FindStr 命令。
⽂章⽬录
熟悉 Linux/Unix 的朋友们都知道,grep 命令有这样如下常见的参数:
本⽂将使⽤ Select-String 来对这些功能进⾏⼀⼀实现。
由于 grep -n 是列出每⼀个符合条件的⾏号,⽽ PowerShell 默认就会输出⾏数,这⾥不再提此。
递归搜索(对⽐grep -r)
使⽤ Get-ChildItem -Path ⽂件路径 -Recurse | select-string -pattern "模式"
例⼦:我在 E:\sourcecode\bin\test 有⼀个⽂件 和若⼲⽬录:
E:\sourcecode\bin\test>tree /f
卷⽂档的⽂件夹 PATH 列表
卷序列号为 0008-09A4
E:.
│
├─1
││
│└─1.1
│
├─2
│
└─3
<
⽤上述命令结果如下(因为我已经 cd 到此⽬录下了,故没指定 -Path)
PS E:\sourcecode\bin\test> Get-ChildItem-Recurse |Select-String-Pattern "⼲"
<:9:mozzarella n.意⼤利⽩⾊⼲酪
<:11:parmesan n.帕尔马⼲酪 adj.巴马的(a hard, dry cheese used in grated form, especially on Italian
dishes.)
<:15:reggiano n.⼲酪
:9:mozzarella n.意⼤利⽩⾊⼲酪
:11:parmesan n.帕尔马⼲酪 adj.巴马的(a hard, dry cheese used in grated form, especially on Ital
ian dishes.)
:15:reggiano n.⼲酪
1\1.1\:9:mozzarella n.意⼤利⽩⾊⼲酪
1\1.1\:11:parmesan n.帕尔马⼲酪 adj.巴马的(a hard, dry cheese used in grated form, especially o
n Italian dishes.)
1\1.1\:15:reggiano n.⼲酪
:9:mozzarella n.意⼤利⽩⾊⼲酪
:11:parmesan n.帕尔马⼲酪 adj.巴马的(a hard, dry cheese used in grated form, especially on Ital
ian dishes.)
:15:reggiano n.⼲酪
:9:mozzarella n.意⼤利⽩⾊⼲酪
:11:parmesan n.帕尔马⼲酪 adj.巴马的(a hard, dry cheese used in grated form, especially on Ital
ian dishes.)
:15:reggiano n.⼲酪
输出有点乱,看不出⽂件层次,不知道有没有更美观的⽅法, 希望有⼈能够给出建议。下图是 grep 的,也有点乱:
PS E:\sourcecode\bin\test> grep -nr "⼲"
1/1.1/:9:mozzarella n.意⼤利⽩⾊⼲酪
1/1.1/:11:parmesan n.帕尔马⼲酪 adj.巴马的(a hard, dry cheese used in grated form, especially on
Italian dishes.)
1/1.1/:15:reggiano n.⼲酪
:9:mozzarella n.意⼤利⽩⾊⼲酪
:11:parmesan n.帕尔马⼲酪 adj.巴马的(a hard, dry cheese used in grated form, especially on Itali
an dishes.)
:15:reggiano n.⼲酪
:9:mozzarella n.意⼤利⽩⾊⼲酪
:11:parmesan n.帕尔马⼲酪 adj.巴马的(a hard, dry cheese used in grated form, especially on Itali
an dishes.)
:15:reggiano n.⼲酪
:9:mozzarella n.意⼤利⽩⾊⼲酪
:11:parmesan n.帕尔马⼲酪 adj.巴马的(a hard, dry cheese used in grated form, especially on Itali
an dishes.)
:15:reggiano n.⼲酪
<:9:mozzarella n.意⼤利⽩⾊⼲酪
<:11:parmesan n.帕尔马⼲酪 adj.巴马的(a hard, dry cheese used in grated form, especially on Italian dishes.)
<:15:reggiano n.⼲酪
在 到了美观输出的⽅法。显⽰的有点不对…
Get-ChildItem-Recurse |Select-String-Pattern "⼲"|Select Filename, LineNumber, Line, Path |Format-Table
PS E:\sourcecode\bin\test> Get-ChildItem-Recurse |Select-String-Pattern "⼲"|Select Filename, LineNumber, Line, Pat
h |Format-Table
Filename LineNumber Line Path
--------------------------
< 9 mozzarella n.意⼤利⽩⾊⼲酪 E:\sourcecode\bin\
< 11 parmesan n.帕尔马⼲酪 E:\sourcecode\bin\
< 15 reggiano n.⼲酪 E:\sourcecode\bin\
< 9 mozzarella n.意⼤利⽩⾊⼲酪 E:\sourcecode\bin\test\
< 11 parmesan n.帕尔马⼲酪 E:\sourcecode\bin\test\
< 15 reggiano n.⼲酪 E:\sourcecode\bin\test\
9 mozzarella n.意⼤利⽩⾊⼲酪 E:\sourcecode\bin\test\
11 parmesan n.帕尔马⼲酪 E:\sourcecode\bin\test\
15 reggiano n.⼲酪 E:\sourcecode\bin\test\
< 9 mozzarella n.意⼤利⽩⾊⼲酪 E:\sourcecode\bin\test\
< 11 parmesan n.帕尔马⼲酪 E:\sourcecode\bin\test\
< 15 reggiano n.⼲酪 E:\sourcecode\bin\test\
< 9 mozzarella n.意⼤利⽩⾊⼲酪 E:\sourcecode\bin\test\
< 11 parmesan n.帕尔马⼲酪 E:\sourcecode\bin\test\
< 15 reggiano n.⼲酪 E:\sourcecode\bin\test\
我们注意到 Path 这⼀栏下⾯的部分内容被省略号替换掉了。怎么让它显⽰全呢?我们需要两个步骤
1. ⾸先让 Format-table 不再截断内容,这个可以通过开关参数 -Autosize 完成。但是由于 PowerShell 窗⼝有个宽度限制使我们不能
看全,内容依然被截断了。
2. 所以我们最好导出到⽂件中,使⽤ Out-File -Width len 来指定导出⽂件的宽度,这个 len 宽度最好⼤于我们输出内容的最⼤宽度。⼀个例⼦
$results|Format-Table-AutoSize |Out-File-Width 512 C:\ -Append
参考
区分⼤⼩写(对⽐grep -i)
使⽤开关参数(SwitchParameter) -CaseSensitive。
默认情况下,匹配项不区分⼤⼩写。
只打印出匹配⾏的数量(对⽐grep -c)
PS C:\>$f = select-string-path audit.log -pattern "logon failed"
PS C:\>$f.count
第⼆个命令使⽤对象数组的 Count 属性来显⽰到的匹配项数
⽐如说,有 4 ⾏有 logon failed 这个 pattern,输出就是 4。
捕获具有匹配项的⾏前后的指定⾏数(对⽐grep -C N)
使⽤ -Context <Int32[]>
PS C:\>$f = select-string-path audit.log -pattern "logon failed"-context 2, 3
此命令将在 Audit.Log ⽂件中搜索短语“logon failed”。它使⽤ Context 参数来捕获匹配项的前 2 ⾏和后 3 ⾏。
搜索多个匹配项(贪婪模式)
使⽤开关参数 -AllMatches
在每个⽂本⾏中搜索多个匹配项。在没有此参数的情况下,Select-String 只会查每个⽂本⾏中的第⼀个匹配项。
这个参数帮助⽂档是这样写的,但是其作⽤我也不太知道,因为 Select-String 默认好像也可以以搜全。
匹配多个模式(对⽐grep -e 表达式)
来⾃
例如搜索 C:\Logs that contain the words "VendorEnquiry"和“Failed”的所有⽂件
⽅法⼀
Get-ChildItem C:\Logs |
where {$_|Select-String-Pattern 'VendorEnquiry'}|
where {$_|Select-String-Pattern 'Failed'}|
...
⽅法⼆
改进⽅法⼀,可以⽤⼀个筛选器来简化这个过程来匹配多个模式,⽽不是⼿动编写每个 Select-String 调⽤。
filter MultiSelect-String($Patterns){
# Check the current item against all patterns.
foreach($Pattern in $Patterns){
# If one of the patterns does not match, skip the item.
$matched = @($_|Select-String-Pattern $Pattern)
if(-not$matched){
return
}
}
# If all patterns matched, pass the item through.
$_
}
Get-ChildItem C:\Logs | MultiSelect-String 'VendorEnquiry','Failed',...
⽅法三
如果要按任意顺序匹配这两个单词,使⽤:
Get-ChildItem C:\Logs|select-string-pattern '(VendorEnquiry.*Failed)|(Failed.*VendorEnquiry)'
反转(对⽐grep -v)
使⽤开关参数 -NotMatch
查与指定的模式不匹配的⽂本。
不要求输出(对⽐grep -q)
使⽤开关参数 -Quiet
返回布尔值(true 或 false),⽽不是 MatchInfo 对象。如果到该模式,则该值为“true”;否则为“false”。从⽂件读取匹配模式 pattern(对⽐grep -f)
grep -f 即 grep --file=filename 。其中 filename 指的是⼀个含有多⾏⽂本的⽂件名,⽽每⾏⽂本是⼀个匹配模式。Get-Content.\ |Select-String-Pattern (Get-Content.\)
其中 .\ 是那个每⾏都是⼀个匹配模式的⽂件,⽽ .\ 则是我们要搜索的⽂件。
powershell创建目录参考
⾄于 grep 的 -w word 、 -l 和 -h 没见过实际例⼦,这⾥不提。
突然发现 PowerShell 下使⽤ grep 可以搜中⽂,⽽ cmd 下⾯的搜不了…
这就是说使⽤ PowerShell 既可以使⽤ Linux/Unix 命令带来的便捷还可以使⽤ PowerShell 提供的命令,就好像⼿上有了两把武器。当然此⽂侧重在简单对⽐,Select-String 和 grep 的其他⾼级⽤法这⾥并没有涉及。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论