PowerShell(tail代替)


アニメ『バチカン奇跡調査官』
奇跡が本当に奇跡かどうか調査する神父さんたちが登場します。

コマンドラインも小さな奇跡と感じている私なので、毎日ふつうに奇跡を目の当たりにしています。
今回の奇跡はPowerShellでtailと同じようなことをやる奇跡です。

(本記事はPowerShell入門記事としてコチラにもまとめています。)

まずは実験用ファイルを作成。

PS C:\Users\takk\aaa> 1..5 | %{$fname="file$_.txt";1..10 | %{$r=random; "$_ $r" >> $fname}}
PS C:\Users\takk\aaa>

各ファイルのtail -3です。

PS C:\Users\takk\aaa> gci -name | %{"===$_===";(gc $_)[-3..-1]}
===file1.txt===
8 327987977
9 331443027
10 1762377467
===file2.txt===
8 2018881294
9 1181652202
10 1522374748
===file3.txt===
8 335203631
9 1128505680
10 1292207698
===file4.txt===
8 479540247
9 529618067
10 1633330444
===file5.txt===
8 1983671095
9 522046106
10 2118231412
PS C:\Users\takk\aaa>

とまあ、tailの代替として配列アクセスで簡単に書けてしまうのですが、tailやheadといったコマンドって、そのコマンド名だからこそいい、と思っています。
ですので、headはhead、tailはtailコマンドとして使いたいです。

ということで関数化してみます。関数といってもフィルタとして定義するのでfunctionの代わりにfilterを使います。
まずはheadから。

PS C:\Users\takk\aaa> filter head(){
>> begin{$cnt=5}
>> process{$cnt--;if($cnt -ge 0){ $_ }}
>> }
>>
PS C:\Users\takk\aaa> 1..10
1
2
3
4
5
6
7
8
9
10
PS C:\Users\takk\aaa> 1..10 | head
1
2
3
4
5
PS C:\Users\takk\aaa>

次はtail。すべて読み込んでからでないと末尾が取得できないので面倒です。

PS C:\Users\takk\aaa> filter tail(){
>> begin{$arr=@()}
>> process{$arr += $_}
>> end{$arr[-5..-1]}
>> }
>>
PS C:\Users\takk\aaa> 1..10
1
2
3
4
5
6
7
8
9
10
PS C:\Users\takk\aaa> 1..10 | tail
6
7
8
9
10
PS C:\Users\takk\aaa>

できました。

コメント

タイトルとURLをコピーしました