PowerShell相当于" head -n-3"?

时间:2012-04-09 20:40:43

标签: powershell tail unix-head

我已经能够追踪基本的头/尾功能:

head -10 myfile <==> cat myfile | select -first 10
tail -10 myfile <==> cat myfile | select -last 10

但是如果我想列出除前三个以外的所有行或除前三个之外的所有行,你怎么做?在Unix中,我可以做“head -n-3”或“tail -n + 4”。对于PowerShell应该如何做到这一点并不明显。

6 个答案:

答案 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