SIer時代によく使ったワンライナー


Linuxや、Solaris、HP-UXなど、多くのOSには標準的なインストールでperlが入ってたり or インストールが容易ですね。
システムインテグレーションの仕事でサーバ構築やメンテなどを行いたいけど
本番環境ではツール類を気軽にインストールできない、というのはよくある話で、そんな時にもperlは頼もしい存在でした。
(最近はコンテナやサーバレスなどで状況は変わってきましたが。。。)

SIer時代によく使ったperlのワンライナーをいくつか思い出して紹介します。

簡易TCPサーバ

ネットワークの疎通確認として
サーバ側で任意のTCPポートでlistenして、クライアント側から接続確認したいことがあるでしょう。
perlの標準入力をソケットに吐き出しているので、ちょっとしたファイル転送にも使えます。

簡易TCPサーバ
## 8888/tcpポートでサーバ起動
echo ok | perl -MIO::Socket -pe 'BEGIN{select IO::Socket::INET->new(LocalPort=>shift,Listen=>5,ReuseAddr=>1)->accept}' 8888

クライアントからはtelnet、curl、nc(netcat)コマンドなど、そこらへんにある適当なコマンドで接続します。

クライアント側
curl telnet://サーバのIP:8888

HEXダンプを復号する

tcpdumpや、その他のツールやログ出力などでHEXダンプがあったときに、ちょっと復号したいことがあるでしょう。
vim付属のxxdコマンドを使う方法もありますが、元のダンプを含むテキストを不要部分除去などの加工をしつつ処理するのにperlを使ってました。

HEXダンプを復号
## HEXダンプされたファイル(in.dump)を復号
perl -ne 's/\s//g;print pack("H*",$_)' < in.dump > out

CSVやTSVを縦横回転

項目の多いcsv(カンマ区切りテキスト)ファイルやtsv(タブ区切りテキスト)ファイルを見る時に、
mysqlの\Gメタコマンドやpostgresqlの\xメタコマンドのように、縦横を入れ替えて確認したいことがあるでしょう。

以下のようなエイリアスを作って

csvやtsvを縦横回転
## csvファイルを回転するエイリアス
alias rotcsv='perl -nle '"'"'@c=split(/,/);$max=@c if $max<@c; for ($i=0; $i<$max; $i++) { $r[$i][$l] = $c[$i] }; $l++; END { for (my $j=0; $j < $max; $j++) { print join("\t", @{$r[$j]}) } }'"'"

## tsvファイルを回転するエイリアス
alias rottsv='perl -nle '"'"'@c=split(/\t/);$max=@c if $max<@c; for ($i=0; $i<$max; $i++) { $r[$i][$l] = $c[$i] }; $l++; END { for (my $j=0; $j < $max; $j++) { print join("\t", @{$r[$j]}) } }'"'"

以下の感じで使います。
マルチバイト文字の幅計算が面倒なので桁あわせ処理などはしてないけど、項目が多い場合はかなり読みやすくなります。

使用例
## 元のcsvファイル
$ cat in.csv
id,name,attribute
1,foo,administrator
2,bar,user

## 回転して表示
$ rotcsv < in.csv
id  1   2
name    foo bar
attribute   administrator   user

良い年末を!