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