powershelltailunix-head

PowerShell equivalent for "head -n-3"?


I've been able to track down basic head/tail functionality:

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

But if I want to list all lines except the last three or all lines except the first three, how do you do that? In Unix, I could do "head -n-3" or "tail -n+4". It is not obvious how this should be done for PowerShell.


Solution

  • Like the -First and -Last parameters, there is also a -Skip parameter that will help. It is worth noting that -Skip is 1 based, not zero.

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

    I am not sure PowerShell has something that gives you back everything except the last n lines pre-built. If you know the length you could just subtract n from the line count and use the -First parameter from select. You could also use a buffer that only passes lines through when it is filled.

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

    As a demo:

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