PowerShellでhead,tail相当の処理を行う

LinuxやUNIXを利用している方であれば特に説明する必要も無いが、UNIX系OSにはhead、tailという「最初(最後)から数えて◯行分を出力する」というコマンドが存在する。 特にtailは、fオプションと組み合わせてログの監視を行う際に非常に重宝する。

これと同じことをPowerShellで行う場合は、以下のようにする。

1.headコマンドの場合

headコマンドに相当する操作をPowerShell2.0で行う場合は、以下のようにする。

(出力させるコマンド)[0..出力させたい行数-1]

実際に実行した際の例が以下。頭から数えて5行出力させている。

PS C:\Users\Work> Get-Content C:\Users\Work\test.txt
2 xxxxxxxx
1 xxxxxxxx
3 xxxxxxxx
7 xxxxxxxx
8 xxxxxxxx
4 xxxxxxxx
5 xxxxxxxx
6 xxxxxxxx
13 xxxxxxxx
14 xxxxxxxx
9 xxxxxxxx
10 xxxxxxxx
16 xxxxxxxx
11 xxxxxxxx
12 xxxxxxxx
15 xxxxxxxx
aaga
PS C:\Users\Work> (Get-Content C:\Users\Work\test.txt)[0..4]
2 xxxxxxxx
1 xxxxxxxx
3 xxxxxxxx
7 xxxxxxxx
8 xxxxxxxx

なお、Select-Objectコマンドであれば、firstオプションを用いる事で同様の対応を行う事が出来る。

PowerShell3.0以降の場合、Get-Contentコマンドのオプションにheadが追加されている。

Get-Content 出力させたいファイル -head 出力させたい行数

2.tailコマンドの場合

tailコマンドに相当する操作をPowerShell2.0で行う場合は、以下のようにする。

(出力させるコマンド)[-出力させたい行数..-1]

実際に実行した際の例が以下。後ろから数えて5行出力させている。

PowerShell2.0で「tail -f」を再現するには上記とwhileを組み合わせると良いだろう。 …といっても、完璧に「tail -f」を再現する訳ではなく、ただただコマンドを何度も実行させているだけなんだけど。

while ($true -eq $true){(実行させたいコマンド)[-出力させたい行数..-1] ; sleep 間隔(秒)}

実際に実行した例がこちら。

PS C:\Users\Work> while ($true -eq $true) {(Get-Content C:\Users\Work\test.txt)[-5..-1] ; sleep 1}
16 xxxxxxxx
11 xxxxxxxx
12 xxxxxxxx
15 xxxxxxxx
aaga
16 xxxxxxxx
11 xxxxxxxx
12 xxxxxxxx
15 xxxxxxxx
aaga
16 xxxxxxxx
11 xxxxxxxx
12 xxxxxxxx
15 xxxxxxxx
aaga
…

見難いようであれば、sleepの前に区切り("--------"とか)をechoで呼び出す、もしくはコマンド実行前にdateを出力してあげるといいかも知れない。

PS C:\Users\Work> while ($true -eq $true) { Get-Date ; (Get-Content C:\Users\Work\test.txt)[-5..-1] ; echo "----------" ; sleep 1}
2015年1月6日 20:13:00
16 xxxxxxxx
11 xxxxxxxx
12 xxxxxxxx
15 xxxxxxxx
aaga
----------
2015年1月6日 20:13:01
16 xxxxxxxx
11 xxxxxxxx
12 xxxxxxxx
15 xxxxxxxx
aaga
----------
2015年1月6日 20:13:02
16 xxxxxxxx
11 xxxxxxxx
12 xxxxxxxx
15 xxxxxxxx
aaga
----------
2015年1月6日 20:13:03
16 xxxxxxxx
11 xxxxxxxx
12 xxxxxxxx
15 xxxxxxxx
aaga
----------
2015年1月6日 20:13:04
16 xxxxxxxx
11 xxxxxxxx
12 xxxxxxxx
15 xxxxxxxx
aaga
----------
…

更に上記コマンドの最後にclearを組み合わせて上げれば、実行結果も全て削除される。 なお、Get-Contentコマンドにはファイルに変動があった場合、再度読込みを行うwaitオプションが存在している。

PowerShell3.0以降の場合、Get-Contentコマンドのオプションにtailが追加されている。

Get-Content 出力させたいファイル -head 出力させたい行数