2012-04-09 2 views
20

Я был в состоянии отследить основные функциональные возможности голова/хвост:эквивалент Powershell для «head -n-3»?

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

Но если я хочу, чтобы перечислить все строки за исключением последних трех или всех строк, кроме первых трех, как ты это делаешь? В Unix я мог бы делать «head -n-3» или «tail -n + 4». Не ясно, как это должно быть сделано для Powershell.

ответ

9

Как и во- первых параметров кого, есть также -Skip параметр, который поможет. Стоит отметить, что -Skip 1, а не ноль.

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

Я не уверен, что у PowerShell есть что-то, что возвращает вам все, кроме последних n строк, предварительно построенных. Если вы знаете длину, вы можете просто вычесть n из числа строк и использовать параметр -First из select. Вы также можете использовать буфер, который пропускает только строки, когда он заполняется.

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 
0

Все, кроме первого n может быть сделано с

... | Select -skip $n 

Однако все «но в последнем m» не имеет ничего встроенного. Это выполнимо, загружая весь вход в массив, чтобы получить длину - конечно, для большого ввода, который может поставить необоснованные требования к памяти.

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 
2

Если вы используете PowerShell Community Extensions, есть командлет Take-Object, который будет проходить через все выходные, за исключением последних N элементов, например:

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

Полезная информация распространяется на другие ответы здесь, но, я думаю, полезно иметь кратким резюме:

Всех линии, за исключением первых три

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 

уборщик синтаксис использовать как Кит Хилл предложил, командлет Скип-Object из PowerShell Community Extensions (Пропускать-Последняя функция в ответ Goyuix в выполняет то же самое, но с использованием 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 
0

Все, кроме последнего n может быть сделано с

... | select -skiplast $n