comando powershell tail unix-head

powershell - comando - head cmd windows



¿Powershell equivalente para “head-n-3”? (6)

Al igual que los parámetros -First y -Last, también hay un parámetro -Skip que ayudará. Vale la pena señalar que -Skip se basa en 1, no en cero.

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

No estoy seguro de que PowerShell tenga algo que te devuelva todo, excepto las últimas n líneas preconstruidas. Si conoce la longitud, simplemente puede restar n del recuento de líneas y usar el primer parámetro de selección. También puedes usar un búfer que solo pase las líneas cuando se llena.

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) } }

Como demostración:

# this would display the entire file except the last five lines cat myfile | Skip-Last -count 5

He podido rastrear la funcionalidad básica de cabeza / cola:

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

Pero si quiero enumerar todas las líneas excepto las últimas tres o todas las líneas excepto las primeras tres, ¿cómo lo haces? En Unix, podría hacer "head -n-3" o "tail -n + 4". No es obvio cómo se debe hacer para Powershell.


Aquí se distribuye información útil a través de otras respuestas, pero creo que es útil tener un resumen conciso:

Todas las líneas excepto las tres primeras.

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

Todas las líneas excepto las tres últimas.

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

Es decir, puede hacerlo con los comandos PowerShell incorporados, pero existe la molestia de tener que especificar el tamaño al entrar. Una solución simple es usar una constante más grande que cualquier entrada posible y no necesitará saber el tamaño. a priori:

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

Una sintaxis más limpia es utilizar, como sugirió Keith Hill, el cmdlet Skip-Object de PowerShell Community Extensions (la función Skip-Last en la respuesta de Goyuix funciona de manera equivalente, pero el uso de PSCX evita que tenga que mantener el código):

1..10 | Skip-Object -last 3 returns (one per line): 1 2 3 4 5 6 7

Primeras tres lineas

1..10 | Select-Object –first 3 returns (one per line): 1 2 3

Tres ultimas lineas

1..10 | Select-Object –last 3 returns (one per line): 8 9 10

Cuatro líneas medias

(Esto funciona porque el -skip se procesa antes que el -first , independientemente del orden de los parámetros en la invocación).

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


Puedes hacerlo así:

[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


Si está utilizando las extensiones comunitarias de PowerShell , hay un cmdlet Take-Object que pasará por todos los resultados, excepto los últimos N elementos, por ejemplo:

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


Todo menos el último n se puede hacer con

... | select -skiplast $n


Todos menos el primer n se puede hacer con

... | Select -skip $n

Sin embargo, todo "pero la última m " no tiene nada incorporado. Es factible cargar toda la entrada en una matriz para obtener la longitud, por supuesto, para una entrada grande que puede poner demandas irrazonables en la memoria.