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逆引き辞典/日付と時刻へ

Perlの書籍
  • 初めてのPerl 第7版

    Perl入門 定番の一冊
  • 業務に役立つPerl

    ログ解析など日本語を含むテキスト処理の実践!
  • 詳説 正規表現

    正規表現の詳細な解説
  • Perlの書籍販売 14冊 »
自己紹介
木本裕紀(きもとゆうき)

Twitter

フォロー、いいね、リツート、コメント歓迎

Youtube

チャンネル登録、いいね、コメント歓迎
Perlの求人広告募集中