VISH,Inc.

意外と使えるPHPのワンライナー

ワンライナープログラム(コマンドラインから実行できるような1行だけのプログラム)といえば、Perlじゃね。
と勝手に思い込んでいるまるやまです。こんにちは。

しかし、うちの会社はPerlは知らんがPHPなら使えるという人がなぜか多いんですが、「ま、最近はそんな時代なのかな」と寂しく思いつつ、そんな方たちでも使えるワンライナープログラムを考えてみました。


php はコマンドラインで使う時、 -r オプションのあとにスクリプトを書くことができます。
$ php -r 'echo "Hello world!\n";'
を実行すると「Hello world!」と表示されます。
あと、あんまり知られてない気がするのですが、-Rオプションを使うと、標準入力の内容を一行ずつの処理をさせるといったことができます。

$ cat data.txt | php -B '$i=1;' -R 'echo $i++.":".$argn."\n";'
を実行すると、data.txtの内容を行番号をつけて表示します。-Bの後の $i=1 で変数を初期化して、-Rの後の分は1行ずつの処理。$argnには処理中の文字列が自動的に入るようになっています。

-Rを使う時は、-Bで前処理させたり、-Eで後処理をさせることもできちゃいます。
-Rオプションを使った場合には、$argnに処理中の文字列の内容、$argi に処理中の行番号が入ります。
-Rで処理した内容を、-Eでアウトプットするという感じで使えます。

あ、上のワンライナーはこういう風にもかけそうですね。
$ cat data.txt | php-R 'echo $argi.":".$argn."\n";'
ちょっとすっきり。

・・・というわけで、私の足らない頭で考えたPHPワンライナーをご紹介しましょう。

■ あるウェブページの内容を表示
php -r 'print file_get_contents($argv[1]);' http://www.vish.co.jp/
これはPHPが一番簡単にできるんじゃないですかねー。$argv にコマンドラインでの引数を受け取ることができます。これは他の言語と同じですね。

■ あるファイルの文字コードを変換
$ cat filename | php -R 'print mb_convert_encoding($argn, "UTF-8", "SJIS") . "\n";' > filename

ちょっと長いなー。sedとnkf使えよといわれそうですが・・・。ま、PHPで書くとこんな感じになるよってことで。

■ カレントディレクトリのファイルサイズの合計を計算
$ ls -l | php -R '$l=preg_split("/\s+/",$argn);@$t+=$l[4];' -E 'echo $t."\n";'

du 使えよって話ですが。

■ タブ区切りのテキストファイルで特定の列を集計
$ cat main | php -R '$d=explode("\t",$argn);@$t[$d[4]]++;' -E 'print_r($t);'
これはですね、TSVファイルの集計です。4列目に都道府県があるとしたら、結果は以下のような感じです。
Array
(
[愛知県] => 14
[岐阜県] => 12
[三重県] => 14
[北海道] => 23
[長野県] => 12
[東京都] => 31
[兵庫県] => 12
[神奈川県] => 24
[宮城県] => 28
[京都府] => 27
[千葉県] => 31
[富山県] => 12
[滋賀県] => 14
[福島県] => 17
[大阪府] => 38
[静岡県] => 12
[石川県] => 5
)

これは結構便利じゃないですか。。。別に?ああ、そーですか。そーですか。

■ apacheのアクセスログを読み込みユニークユーザ数(IP数)を調べる
$ cat access_log | php -R '$l=explode(" - ",$argn);if(@++$h[$l[0]]==1)@$t++;' -E 'print $t."\n";'
Google analytics使えばよくね?って話もありますが・・・。

■ apacheのアクセスログで日付毎のアクセス集計
$ cat access_log | php -R 'preg_match("/\[(\d+\/\w+\/\d+)/",$argn,$m);@$h[$m[1]]++."\n";' -E 'print_r($h);'
だからー、Google analytics使いなよって?
でもですね、
Array
(
[12/Apr/2009] => 50
[13/Apr/2009] => 227
[14/Apr/2009] => 170
[15/Apr/2009] => 152
[16/Apr/2009] => 92
[17/Apr/2009] => 237
)

って手軽にアクセス解析できますよ。(だめ?)

■ 画像のプロパティを見る(縦横サイズとか)
$ php -r 'print_r(getimagesize($argv[1]));' imagefilename
GDライブラリが必要です。これはPHPならではですよね。

■ GIFファイルをPNGファイルに変換
$ php -r 'imagepng(imagecreatefromgif($argv[1]),preg_replace("/gif/","png",$argv[1]));' filename.gif
GDライブラリが必要です。ちゃんと拡張子変換機能もついてますw

■ サーバのロードアベレージが1を超えたらメールで報告
$ /usr/bin/uptime | /usr/bin/php -R '$l=explode(" ",$argn);if($l[12] >= 1)mail("mail@xxxxx.co.jp","load avg report",$argn);'

これをcrontabに登録しておくと便利です。


$ crontab -e
* * * * * /usr/bin/uptime | /usr/bin/php -R '$l=explode(" ",$argn);if($l[12] >= 1)mail("mail@xxxxx.co.jp","load avg report",$argn);'

で1分おきに自動チェックして、負荷が高いときにメールしてくれます。3分おきにしたければ、最初の「*」を「*/3」にするべし。
[12]ってところは環境によって変わるかも。あ、動作確認してませんので、自己責任でお願いします。

といろんなPHPワンライナーを作ってみましたがどうですか。
上記のような長いワンライナーは覚えきれないですね。(汗) でも、-r -R オプションのことはおぼえておいて損はないと思います。これさえ知っていれば、自分で応用していろいろ料理できるはず・・・です。

えーと、これだけ書いておいて言うのもなんですが、僕はやっぱりperlを使います。(をい)

blog.vish.co.jp

Leave a Reply


VISH企業サイト
サイトマスター.jp
モバイルサイト制作・構築