Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl

ログから特定の時刻を含むレコードを切り出す

特定の時刻を含むレコードを切り出すサンプルです。

use strict;
use warnings;

print "(1)特定範囲の時刻を含むレコードを切り出す。\n";
my @records = (
  '1  7:00:00 aaa',
  '2  8:00:00 iii',
  '3  9:00:00 uuu',
  '4 10:00:00 eee',
  '5 11:00:00 ooo',
);

my $start_time = '08:00:00';

# この時刻は含まないこととする
my $end_time = '11:00:00'; 

for my $record (@records) {
  
  # 時刻を切り出す
  if ($record =~ / (\d{1,2}):(\d{2}):(\d{2}) /) {
    # 書式をあわせることで文字列として比較ができる。
    # '7:00:00' -> '07:00:00'
    my $time = sprintf("%02s:%02s:%02s", $1, $2, $3);
    
    # 開始時刻から終了時刻までに含まれるレコードを切り出す。
    if ($time ge $start_time && $time lt $end_time) {
      print $record . "\n";
    }
  }
}

実行結果

(1)特定範囲の時刻を含むレコードを切り出す。
2  8:00:00 iii
3  9:00:00 uuu
4 10:00:00 eee

解説

時刻のフォーマットを整える

sprintf関数を使用して時刻のフォーマットを整えます。同じ長さの文字列長に整えることによって文字列での比較が可能になります。

if ($record =~ / (\d{1,2}):(\d{2}):(\d{2}) /) {
  my $time = sprintf("%02s:%02s:%02s", $1, $2, $3);
  
  if ($time ge $start_time && $time lt $end_time) {
    print $record . "\n";
  }
}

開始時刻から終了時刻までに含まれるレコードを切り出す

ge、lt は文字列での辞書順でどちらが先かを比較する演算子です。 geはgreater than or equel( 以上 ) の略でlt は lower than( より小さい )の略です。

if ($time ge $start_time && $time lt $end_time) {
  print $record . "\n";
}

Perl逆引き辞典/日付と時刻へ

Giblog