programing

"헤드-n-3"에 해당하는 PowerShell?

css3 2023. 8. 13. 09:52

"헤드-n-3"에 해당하는 PowerShell?

기본적인 헤드/테일 기능을 추적할 수 있었습니다.

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

하지만 마지막 세 줄을 제외한 모든 줄을 나열하거나 처음 세 줄을 제외한 모든 줄을 나열하려면 어떻게 해야 합니까?유닉스에서는 "헤드-n-3" 또는 "테일-n+4"를 할 수 있었습니다.PowerShell에 대해 이 작업을 수행하는 방법은 명확하지 않습니다.

유용한 정보는 여기에 있는 다른 답변들에 걸쳐 있지만, 저는 다음과 같이 간결하게 요약하는 것이 유용하다고 생각합니다.

처음 세 개를 제외한 모든 라인

1..10 | Select-Object -skip 3
returns (one per line): 4 5 6 7 8 9 10

마지막 세 개를 제외한 모든 라인

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 Community Extensions의 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

-First 및 -Last 매개변수와 마찬가지로 -Skip 매개변수도 유용합니다.-Skip은 0이 아니라 1을 기반으로 합니다.

# this will skip the first three lines of the text file
cat myfile | select -skip 3

PowerShell이 사전 구축된 마지막 n개 라인을 제외한 모든 것을 되돌려 줄 수 있는 것이 있는지 확신할 수 없습니다.길이를 알면 라인 카운트에서 n을 빼고 선택에서 -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

PowerShell Community Extensions를 사용하는 경우 마지막 N개 항목을 제외한 모든 출력을 통과하는 Take-Object cmdlet이 있습니다. 예:

30# 1..10 | Skip-Object -Last 4
1
2
3
4
5
6

마지막을 제외한 모든 것n으로 할 수 있는

... | select -skiplast $n

다음과 같이 할 수 있습니다.

[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

첫 번째를 제외한 모든 것n으로 할 수 있는

... | Select -skip $n

하지만 마지막을 제외한 모든 것.m내장된 것이 없습니다.길이를 얻기 위해 전체 입력을 어레이에 로드하는 것은 가능합니다. 물론 메모리에 무리한 요구를 가할 수 있는 큰 입력의 경우도 마찬가지입니다.

언급URL : https://stackoverflow.com/questions/10079572/powershell-equivalent-for-head-n-3