私は基本的な頭/尾の機能を追跡することができました:
head -10 myfile <==> cat myfile | select -first 10
tail -10 myfile <==> cat myfile | select -last 10
しかし、最後の3行を除くすべての行、または最初の3行を除くすべての行を一覧表示する場合、どのように行いますか? Unixでは、「head-n-3」または「tail-n +4」を実行できます。これをPowerShellでどのように行うべきかは明らかではありません。
ここでは有用な情報が他の回答にも広がっていますが、簡潔な要約があると便利だと思います。
first3を除くすべての行
1..10 | Select-Object -skip 3
returns (one per line): 4 5 6 7 8 9 10
last3を除くすべての行
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コマンドレットを使用することです(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
中央4行
(これは、呼び出しのパラメーターの順序に関係なく、-skip
が-first
の前に処理されるために機能します。)
1..10 | Select-Object -skip 3 -first 4
returns (one per line): 4 5 6 7
PowerShell Community Extensions を使用している場合、最後のN項目を除くすべての出力を通過するTake-Objectコマンドレットがあります。例:
30# 1..10 | Skip-Object -Last 4
1
2
3
4
5
6
あなたはこのようにそれを行うことができます:
[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 -skiplast $n
最初のn
以外はすべて次のコマンドで実行できます
... | Select -skip $n
ただし、すべての「最後のm
を除く」には何も組み込まれていません。入力全体を配列にロードして長さを取得することは可能です。もちろん、メモリに不当な要求を課す可能性のある大きな入力の場合です。