技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

ファイルから指定した行間だけを抜き出すスクリプト

ファイルから指定した行間だけを抜き出すスクリプト pickup.pl を作成した。ログファイルなど、非常にサイズの大きいファイルをエディタで見ると、エディタがメモリ不足でまともに動かないことがあるので、必要な行間だけをピックアップして見たい時に使用すると良いと思う。

使い方は、例えば以下のように、ピックアップの開始行、終了行、対象のファイルパスを指定する。
perl pickup.pl -s 1000 -e 2000 bigSize.log
(bigSize.logの1000~2000行目をピックアップする)

ピックアップ結果は、bigSize.log があるディレクトリ配下に pickuped_bigSize.log として作成される。

pickup.pl

use strict;
use warnings;
use Getopt::Long 'GetOptions';
use File::Basename;

my $start;
my $end;
GetOptions(
    'start=s' => \$start,
    'end=s'   => \$end,
);

unless (($start =~/\d+/) and ($end =~/\d+/)) {
    die "Start and end should be digit...";
}

if ($end < $start) {
    die "End should be bigger than start...";
}

my $inFile = $ARGV[0];
if (! -f $inFile) {
    die "There is not $inFile file...";
}
my $outFile = createOutputFilePath($inFile, "pickuped_");

open(my $inFh,  "< $inFile")  or die("Error :$!");
open(my $outFh, "> $outFile") or die("Error :$!");

my $lineNum = 1;
foreach my $line (<$inFh>) {
    if($start <= $lineNum and $lineNum <= $end) {
        print($outFh $line);
    }
    $lineNum++;
}

close($inFh);
close($outFh);

sub createOutputFilePath {
    my ($inputFilePath, $suffix) = @_;
    my ($name, $dir) = fileparse($inputFilePath);
    my $outputFilePath = $dir . $suffix . $name;
}