技術メモ

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

perl

複数のファイルから複数の項目を grep するスクリプト

一度に grep したくなったので、主題のスクリプトを作成した。 こういうのは、やっぱり perl で書くと楽。 use strict; my $targets = [ # ファイル名、key1, key2, key3, ... ["fileA.txt", "test.keyA1", "test.keyA2"], ["fileB.txt", "test.keyB1", "tes…

Perl で REST API (Post) 実行

perl だと、だいぶ簡単に書ける。素晴らしい。 use strict; use HTTP::Request::Common; use LWP; use JSON; my $uri = "https://httpbin.org/post"; my $postData = {"key1" => "val1", "key2" => "val2"}; my $ua = LWP::UserAgent->new(); my $res = $ua-…

perl の glob vs opendir&readdir

久々に perl スクリプトを書く機会があり、その中で Windows のフォルダ内のファイル一覧を取得したくなった。その際、主題のように glob と opendir&readdir のどちらを使うか迷って、以前使ったことのある後者を選んだ。 以下の記事によると、Windows では…

ディレクトリ配下の全ファイルの文字コードを一覧で出す

久々にperlスクリプトを作成した。作ったのは、指定したディレクトリ配下を再帰的に辿り、存在する全ファイルの文字コードを一覧で出すというもの。以下のようにして実行する。 perl printCharCode.pl "対象のディレクトリ" printCharCode.pl の内容は以下の…

perl の正規表現の最小マッチ

perl で、文字列の前後のスペースをトリムする時は、正規表現を利用して、 $str =~ s/^\s*(.*?)\s*$/$1/; というコードを書く。上記の (.*?) の中の「?」が何のために必要なのか、よく忘れてしまうので、ここにメモしておく。結論から言うと、perl の正規表…

文字参照を含むファイルを通常の文字列に変換して出力する

html の文字参照を含むファイルを通常の文字列に変換して出力する perl スクリプトを作成した。使い方は、perl "スクリプト名" "文字参照を含むファイル" use strict; use warnings; use HTML::Entities; use Encode; my $file = $ARGV[0]; open(my $in, "< …

意図した順でログが出ているか確認するスクリプト

意図した順でログが出ているかを確認する perlスクリプト checkOrder.pl を作成した。使い方は、スクリプト冒頭の以下の箇所を順番を確認したいもの(正規表現)に書き換えてから、 my @logs = ("test log message1", "test log message2", "test log message3…

ファイルを指定したサイズで分割するスクリプト

ファイルを指定したサイズで分割するperlスクリプト (splitFile.pl) を作成した。例えば、巨大なログファイルをエディタで開こうとすると、メモリ不足でまともに見れなくなってしまうので、そんな場合はこのスクリプトで分割してから見ようと思っている。 使…

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

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

perl で外部コマンドの戻り値を取得する。

perl のsystem関数を使って外部コマンドを実行する時、外部コマンドの戻り値を取得するには、ちょっと注意が必要。Perlの組み込み関数 system の翻訳 - perldoc.jp 返り値は、wait が返すプログラムの exit 状態です。 実際の exit 値を得るには 右に 8 ビッ…

perl でハッシュを使って探索を高速化する。

要素数が大量にある配列に対して線形探索を行うと、とても時間がかかることがある。その場合、各要素をハッシュの key に入れておくと、探索の際にかなり高速化できる。以下のコードでは、配列をgrepする場合、配列をforeachで回す場合、(今回取り上げている…

perlで現在時刻を (秒以下の精度で) 取得する。

perl には、現在時刻を取得する関数として localtime 関数がある。ただし、この関数では秒以下の精度で時刻を取得できない。そうしたい場合は、Time::HiRes モジュールの gettimeofday 関数を取得する。gettimeofday関数を使ったサンプルを以下に示す。 use …

perlで文字列から1文字ずつ取得

perl で文字列から1文字ずつ取得して配列に格納するには、以下のように split 関数を使うのが楽。splitString.pl use strict; use warnings; use Encode; my $inputStr = shift; my $decodedInputStr = decode('Shift_JIS', $inputStr); # SJISの文字列から…

16進のSNMP OIDを通常の文字列の形式に変換する

主題の処理を行うperlスクリプト convertOidHexToStr.pl を作成した。使い方は、例えば、「perl convertOidHexToStr.pl 2b06010401CE0F」 や 「perl convertOidHexToStr.pl "2b 06 01 04 01 CE 0F"」 のように指定すると、結果として、人に優しい形式でOID文…

SNMP trap (coldStart) 送信スクリプト

以前作成した以下の perl スクリプトをエンハンスした。 akrad.hatenablog.com具体的には、SNMPv1 のcoldStartトラップも SNMPv2cのcoldStartトラップも送信できるようにし、トラップ送信先やSNMPv1トラップの agent-addrフィールドも指定できるようにした。…

SNMP v2c trap (coldStart) 送信スクリプト

SNMP v2c の trap (coldStart) を送信するperlスクリプト sendTrap.pl を作成した。perl sendTrap.pl として実行すると、localhost の 162/udp に対して、coldStartトラップを送信する。例えば、SNMPマネージャのtrap受信テストを簡単に行うのに使用できると…

sprintf関数とunpack関数

sprintf関数とunpack関数は、ともに引数の数値を16進表記に変換できるが、以下の挙動の違いがある。 use strict; use warnings; my $num = 12; my $hexdumpBySprintf = sprintf("%x", $num); my $hexdumpByUnpack = unpack("H*", $num); print "hexdump by s…

udpパケットを送信するスクリプト

指定したホスト、ポートに udpパケットを送信する perl スクリプト sendUdpData.pl を作成した。テストなどで、パケットキャプチャで取得したデータ(16進ダンプ文字列)を、好きな場所に送りたい場合に使う用途で作成した。使い方は以下。 perl sendUdpData.p…

tcp/udpポートを確保し続けるスクリプトを少しエンハンスした。

以前、tcp/udpポートを確保し続けるスクリプト holdPort.pl を作成した。 akrad.hatenablog.com これに引数でholdするIPアドレスを指定できる機能を追加した。例えば、「perl holdPort.pl -port 8080 -ip 127.0.0.1」と実行すると、holdPort.pl は 127.0.0.1…

tcp/udpポートを確保し続けるスクリプト

tcp/udpポートを確保し続ける perl スクリプト holdPort.pl を作成した。テスト等でポート・バッティングを起こすために、指定したポートを確保したい時に使うと便利。 使い方は簡単で、例えば「perl holdPort.pl -p 80」で、このスクリプトは停止するまで 8…

16進ダンプ文字列からバイナリ列を作成するスクリプト

以前、ファイルの中身を16進ダンプするperlスクリプトを作成した。 akrad.hatenablog.com上記に対して、今回作成したperlスクリプト makeBinFromHex.pl は、この逆を行うものである。つまり、16進ダンプ文字列からバイナリ文字列を作成する。例えば、入力フ…

ファイルの中身を16進ダンプするスクリプトをちょっとエンハンス

以前、ファイルの中身を16進ダンプで出力するperlスクリプト dumpHexStr.pl を紹介した。 akrad.hatenablog.comところが、これではファイル内に改行があった場合にそれが省かれてしまうので、改行も含めて16進ダンプするようにした。 use strict; use warnin…

指定したディレクトリ配下のファイル内のタブをスペースに変換するスクリプト

指定したディレクトリ配下のファイル内のタブをスペースに変換するperlスクリプト replaceTabToSpace.pl を作成した。使い方は簡単で「perl replaceTabToSpace.pl "ディレクトリのパス"」で実行できる。例えば、ソースコード内にタブとスペースが混在してい…

各行の先頭に「> 」を付けるスクリプト

各行の先頭に「> 」を付けるperlスクリプト addQuote.pl を作成した。例えば、 aaa bbb ccc ddd という文章に対して、このスクリプトを適用すると、以下のようになる。 > aaa > bbb > ccc > ddd 任意の文章に対して、引用として「> 」を付けたい場合に使用す…

指定したディレクトリ配下のファイルから改行コード LF を探し出すスクリプト

引数で指定したディレクトリ配下のファイルから改行コード LF を探し出すperlスクリプト detectLF.pl を作成した。 使い方は簡単で、「perl detectLF.pl "ディレクトリ"」を実行するだけ。 use strict; use warnings; my $dir = $ARGV[0]; if(! -d $dir) { d…

指定したディレクトリ配下のファイル名やディレクトリ名を全て表示するスクリプト

指定したディレクトリ配下のファイル名やディレクトリ名を、再帰的に全て表示するperlスクリプト printAllUnderDir.pl を作成した。 use strict; use warnings; my $dir = $ARGV[0]; if(! -d $dir) { die "Invalid argument."; } $dir =~ s|\\|/|g; getFileL…

指定されたディレクトリ配下のアーカイブファイルを再帰的に展開するスクリプトを作成した。

指定されたディレクトリ配下にあるアーカイブファイルを再帰的に展開するperlスクリプト extractRecursively.pl を作成した。 使い方は簡単で、「perl extractRecursively.pl "ディレクトリ"」として実行するだけ。 use strict; use warnings; use Archive::…

ファイルに書かれた文字列で検索するスクリプト

ファイルAに書かれた文字列で、ファイルB内を検索するperlスクリプト(findStr.pl)を作成した。使い方は簡単で「perl findStr.pl "ファイルA" "ファイルB"」で実行する。例えば、ファイルAの中身が aaa bbb ccc となっていて、ファイルBの中身が aaa ddd eee …

ファイルの中身を16進ダンプするスクリプト

引数で受け取ったファイルの中身を16進ダンプして、出力用のファイルに出す perl スクリプトを作成した。どういう時に使うかというと、例えば、入力に16進ダンプの文字列を受け付けるプログラムを使いたい時に、このスクリプトで対象の文字列を16進ダンプに…

引数で指定したディレクトリ配下から、BOM付きのファイルを探してくるスクリプト

引数で指定したディレクトリ配下から、BOM(Byte Order Mark)付きのファイルを探してきて、そのファイル名を表示するperlスクリプト findBOM.pl を作成した。 使い方は簡単で、「perl findBOM.pl "検索対象ディレクトリ"」で実行できる。なお、Windows環境で…