アニメ『バチカン奇跡調査官』
奇跡が本当に奇跡かどうか調査する神父さんたちが登場します。
コマンドラインも小さな奇跡と感じている私なので、毎日ふつうに奇跡を目の当たりにしています。
今回の奇跡は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>
できました。


コメント