我已经能够追踪基本的头/尾功能:
head -10 myfile <==> cat myfile | select -first 10
tail -10 myfile <==> cat myfile | select -last 10
但是如果我想列出除前三个以外的所有行或除前三个之外的所有行,你怎么做?在Unix中,我可以做“head -n-3”或“tail -n + 4”。对于PowerShell应该如何做到这一点并不明显。
答案 0 :(得分:21)
有用的信息在这里分布在其他答案中,但我认为有一个简明的摘要是有用的:
first 3
以外的所有行1..10 | Select-Object -skip 3
returns (one per line): 4 5 6 7 8 9 10
last 3
以外的所有行1..10 | Select-Object -skip 3 -last 10
returns (one per line): 1 2 3 4 5 6 7
也就是说,可以使用内置的PowerShell命令来执行此操作,但是必须指定进入的大小是一种烦恼。一个简单的解决方法是使用大于任何可能的常量输入,你不需要先了解大小:
1..10 | Select-Object -skip 3 -last 10000000
returns (one per line): 1 2 3 4 5 6 7
如Keith Hill建议的那样,更清晰的语法是使用来自PowerShell社区扩展的Skip-Object cmdlet(Goyuix的答案中的Skip-Last函数执行等效但使用PSCX使您无需维护代码):
1..10 | Skip-Object -last 3
returns (one per line): 1 2 3 4 5 6 7
首先 三行
1..10 | Select-Object –first 3
returns (one per line): 1 2 3
上次 三行
1..10 | Select-Object –last 3
returns (one per line): 8 9 10
中间 四行
(这是因为-skip
在-first
之前处理,无论调用中的参数顺序如何。)
1..10 | Select-Object -skip 3 -first 4
returns (one per line): 4 5 6 7
答案 1 :(得分:9)
与-First和-Last参数类似,还有一个-Skip参数可以提供帮助。值得注意的是-Skip是1,而不是零。
# this will skip the first three lines of the text file
cat myfile | select -skip 3
我不确定PowerShell有什么可以让你回复除了预先构建的最后n行之外的所有内容。如果您知道长度,则可以从行计数中减去n并使用select中的-First参数。你也可以使用一个缓冲区,它只在填充时传递线。
function Skip-Last {
param (
[Parameter(Mandatory=$true,ValueFromPipeline=$true)][PsObject]$InputObject,
[Parameter(Mandatory=$true)][int]$Count
)
begin {
$buf = New-Object 'System.Collections.Generic.Queue[string]'
}
process {
if ($buf.Count -eq $Count) { $buf.Dequeue() }
$buf.Enqueue($InputObject)
}
}
作为演示:
# this would display the entire file except the last five lines
cat myfile | Skip-Last -count 5
答案 2 :(得分:2)
如果您正在使用PowerShell Community Extensions,则会有一个Take-Object cmdlet,它将通过除最后N个项目之外的所有输出,例如:
30# 1..10 | Skip-Object -Last 4
1
2
3
4
5
6
答案 3 :(得分:1)
你可以这样做:
[array]$Service = Get-Service
$Service[0] #First Item
$Service[0..2] #First 3 Items
$Service[3..($Service.Count)] #Skip the first 3 lines
$Service[-1] #Last Item
$Service[-3..-1] #Last 3 Items
$Service[0..($Service.Count -4)] #Skip the last 3 lines
答案 4 :(得分:0)
第一个n
以外的所有内容都可以使用
... | Select -skip $n
然而,所有“但最后m
”没有任何内置。它可以将整个输入加载到一个数组中以获得长度 - 当然,对于可能对内存提出不合理要求的大量输入。
答案 5 :(得分:0)
除了最后n
之外的所有内容都可以使用
... | select -skiplast $n