I ♥ WordPress

自作ストレージサーバ構築〜パーツ選択〜
2010/02/28 22:32 posted by kunkichi

久々過ぎる更新w

自作ストレージサーバを作ろうと思って、ここんところずっとパーツ選定を考えています。
ってことで、PC自作系の雑誌を立ち読みしてたら、なかなかいい特集がありました。

日経ウィンピーシー 2010年4月号
日経WinPC編集部
日経BP社

特集になってる「お役立ちパーツ150」ってのがなかなかおもしろくて、「SATAがたくさんあるマザー」とか「全面からHDDを出し入れできるケース」とかストレージサーバのパーツ選定に役立ちそうなネタがありました。

そんな感じでとりあえずざっとチョイスしてみました。

ケース

オプション基板をつければ、全面から6本のHDDがホットスワップで出し入れ可能。5インチベイも4つあるので、リムーバブルケースを使えばも少し増やせるし、よさげ。

マザー

SATAが合計10個(うち2個はESATAで)あるのに実売1万円前半というコストパフォーマンスがよさそうなマザー。

CPU

AMD AMD AthlonII X4 605e AD605EHDGIBOX
AMD
売り上げランキング: 42231

マザーボードから必然的にAMD。その中でも4コアで低電圧版、それでもって1万円前半という、これまたコストパフォーマンスの良さそうな感じ。ストレージだったら、CPUはそんなに使うこともないと思うので、AthlonII X2を選べばもっと省電力を図れそう。

電源

サイズ ストロンガーノーマル500W SPSN-050
サイズ
売り上げランキング: 26217

HDDを沢山積む事を考えると、電源にもそれだけのコネクタ数が必要、ってことでSATA端子が8個あって、80PLUSのこれをチョイス。これは500Wだけど、上位機種だと700WでSATA端子が10個あるので、ディスク本数が多ければそれでもよいかも。

その他

光学ドライブはなんでもいいし。HDDとメモリはその時々で。

HDDは今だと1〜2TBが1GB単価が安いけど、価格.comあたりを見る限り、速度が遅いっぽいし、RAID組むことを考えると500GB×2本ぐらいのほうが安くて追加購入もしやすいのでそっちかなぁと。メモリはDDR3がもうちょい安くなってくれると助かります。NICはできればIntelのやつにしたいところ。

とりあえず、実売価格でざっと計算すると、上記に挙げたパーツで4万5千円、HDDはとりあえず500GB=5000円×2として1万円、メモリもとりあえず2GB程度としておけば5千円で済むとすれば、イニシャルは6万ぐらいで済みそう。OSはZFSが使えるSolarisかFreeBSDあたりなら拡張もらくちん。

あとは24時間365日稼働させた場合の消費電力が気になるところ。こつこつパーツを買い集めていきたいと思います。

2010/03/07追記

DDR3メモリの価格が高騰しつつあるような。。。手持ちのDD2 2GB×4を有効活用するなら、GA-EP45-UD3R、GA-EP45-UD3Pあたりかなぁ。SATA×8か、まあ1万円ちょいぐらいやし、クチコミだと非常に安定しているということだし。

GIGABYTE マザーボード GA-EP45-UD3R
日本ギガバイト
売り上げランキング: 25823
GIGABYTE GIGABYTE マザーボード Socket775 IntelP45 GA-EP45-UD3P
日本ギガバイト
売り上げランキング: 87730

そうっすっと、CPUも変えねばいかんのか。IntelだとクアッドよりもE3300あたりがコストパフォーマンス・省電力の両面でいいかも。

インテル Boxed Intel Celeron E3300 2.50GHz 1M LGA775 BX80571E3300
インテル
売り上げランキング: 3690

まあ、AthlonII X2選んだ場合と同じぐらいの価格だから、当初よりも5千円ぐらい安くあがるかな。将来性はほぼなくなるけど。

LinuxのLVMにイマイチ乗り気がしない理由
2009/07/17 01:55 posted by kunkichi

ZFSが便利だから:-)

LVMちゃんと使ったことなくて、現状Linuxでストレージ作るならLVM勉強しなきゃとか思ってたけど、めんどくさすぎ。もういいやー。

ということでZFS本が出ました。早速買って読む。

ZFS 仮想化されたファイルシステムの徹底活用
長原 宏治 佐藤 通敏 今井 悟志 加藤 久慶
アスキー・メディアワークス
売り上げランキング: 2334

[時間割:読書] [お知らせ] メディアマーカーに移行
2009/01/08 23:26 posted by kunkichi

READING HACKS!読書ハック!―超アウトプット生産のための「読む」技術と習慣に書いてあった、「自分の読書の傾向を管理する」ためにお試しで使っていたメディアマーカーですが、書評やレビューはもう完全にあっちに移行することにしました。

mediamarker.jpg

なんといっても便利なのが、

  • 月に書籍購入費がどれだけかかっているか?を把握できる。
  • 月に何冊読了しているか?を把握できる。
  • この二つがグラフで表示される。
  • 本のカテゴリーをタグづけできるのでどの分野に偏っているか?が把握できる。
  • 同じ本を読んだ人の一覧やコメントが「はてブ」チックに見れる。

というところ。似たようなサイトは他にもあるのだけど、基本的にはこれらの点だけ把握できれば個人的には十分なので、満足しています。欲を言うと、

  • 書評ではなく自分用まとめをメインで書きたいのでエディタ機能をもう少し充実してほしい。特に箇条書きができないのが痛い。

というところだけがアレなのですが、まあそのうち改善されることを期待。ちなみに会社の同僚もこれを使っていることがわかったので、互いの本棚をのぞいてる感じがとても楽しかったりします(笑)。

他のITエンジニアの方の本棚ものぞいてみたいです。よかったらトラックバックで教えてください。

メディアマーカー - kunkichiのバインダー

[読書]『DNS & BIND 第5版』
2008/12/08 02:32 posted by kunkichi

第4版もまだ全部読めてないのに、もう改版されてしまいました。

DNS & BIND 第5版
DNS & BIND 第5版
posted with amazlet at 08.12.08
Cricket Liu Paul Albitz
オライリージャパン
売り上げランキング: 54229


今回のキャッシュポイズニング騒動についてもいろいろ載ってるらしい。あとはSPFレコードとかのspam対策向けの設定とかその辺ぐらいかな、見るところは。

Amazonのギフトカードがあるので、とりあえず買っといた。第4版は会社に寄贈しとくか。

[読書]『zsh最強シェル入門』
2008/12/08 02:24 posted by kunkichi

年末にかけて仕事が立て込んでて、勉強はしてるのだけど、アップさぼりまくってます。。。いかんなぁ、忙しいのを言い訳にしちゃ。ちゃんとやらないと。

話は変わって先週末に書店でこんなん見つけて即買っちゃいました。

zsh最強シェル入門
zsh最強シェル入門
posted with amazlet at 08.12.08
中島 能和
翔泳社
売り上げランキング: 10153


なんてニッチなw。

でも一時期開発者界隈では話題になってたし、書籍でまとめてもらった方がネットで情報探すよりもらくちん。リファレンスが手元にあるのはやっぱりいいです。

いろいろなオプションを実際に試して .zshrc カスタマイズ中。GNU screenに関しても載ってるので良さげ。

[時間割:読書] 『ちょっとした勉強のコツ』
2008/11/21 01:48 posted by kunkichi

外山先生の本を読むのは大学入試以来だったりしますw

読書論、的な本を探してたら、とあるブログで紹介されていた『「読み」の整理学』がなかなか面白かったので、続けてこれをチョイス。

ちょっとした勉強のコツ (PHP文庫 と 7-13)
外山 滋比古
PHP研究所
売り上げランキング: 15604

もう10年近く前の本だけど、今読むととてもLifehacks的。紹介されている内容も実践的で手軽に試せそうなものが多くて、でもとても読みやすい、ただちょっと繰り返しが多いかな。『「読み」の整理学』とちょっとかぶってるところもあったりするし。なのでザーッと目を通す程度で読むのが一番いい気がします。でも豊富な例証がさすが外山先生という感じです。

早速気になったところだけピックアップ。

  • 文字通りのハングリーな状態が頭を一番うまく使える。
    →朝の朝食前が心身ともにベスト。朝食と昼食をブランチにして、午前中にがんばるのを試してみよう。
  • ハングリーな状態は時間にも使える。時間があるよりもないほうが集中力が高まる。
    →時間割でメリハリをつけるのは正解。
  • 正しい姿勢が知的活力に影響する。例えば「立って」勉強する。
    →バランスボールとかよいかも。
  • 多少の不都合な状態のほうがより頭が動く。
    →静かな状態よりも多少BGMがあるほうが刺激になる
  • 競い合う友人を持つことで、より効果が上がる。
  • 集中力の持続は訓練することでより向上する。
    →時間割の1単位を少しずつ伸ばしていこう。
  • 読むだけでなく、書くことでより理解力を高める
    →アウトプット重要!
  • 頭を使うことに、付帯条件を付けることで、より理解力が深まる。
    →正しい姿勢、ほどよい暗さ、かすかなBGM
  • 考えるときは頭を冷やすほうがよい。
    →冷却シートとかよいかも。
  • 人が集まる場合は違うタイプの人が集まる方が刺激的。
  • 一つのことに集中しているときこそ、予想外の事実やアイデアに出会うことがある。セレンディピティ。
  • その日のやるべきことを、生活時間割として朝一番に考える。
  • 劣等感やコンプレックスをモチベーションに。ライバルは強ければ強いほどそのモチベーションが高まる。
    →目標は高く!
  • その日のやるべきことを、生活時間割として朝一番に考える。
  • 勉強だけではなく、普段から頭の体操を意識する。→フェルミ推定の問題集とかいい気がするなー。

文庫本なのですぐに読めちゃうし安いんでサラッと読みたい場合はおすすめです。

読書論に限ると↓もおすすめ。

「読み」の整理学 (ちくま文庫 と 1-3)
外山 滋比古
筑摩書房
売り上げランキング: 64833

[時間割:読書] 『READING HACKS!』
2008/10/28 02:14 posted by kunkichi

毎日読書を続けていて思うのはいつもこの2点。

  • もっと早く読みたい!→たくさん読める
  • もっと深く読みたい!→理解力が高まる
  • もっと早くたくさんアウトプットしたい!→アクセス数アップ(爆)

ということで、書店でもちらほら見かける読書本を数冊チョイスしたのですが、そのうちの1冊がこれ。

READING HACKS!―読書ハック! 超アウトプット生産のための「読む」技術と習慣
原尻 淳一
東洋経済新報社
売り上げランキング: 1114

先週まで『本を読む本』をずっと読んでたのですが、『READING HACKS!』が久々のHACK本ということで、『本を読む本』はちょっと休憩して、『READING HACKS!』を先に。読みやすさではこっちのほうが読みやすいし、サブタイトルに「趙アウトプット生産のため」とあったので、まさに今の僕のための本!(笑)ということで、一気に読み終えました。

基本的には、いつものHACK本と同じく、小さなHACKがたくさんまとめられてますが、気になったところだけピックアップ。僕の場合は、技術書が読書のメインなのですが、ビジネス書とは多少違う部分があるので技術書の場合のアプローチも併せて考えてみました。

  • 集中モードへの切り替えにハーブミスト買いました。とりあえずamazonで買ったのだけど、梅田ロフトでも売ってることを確認。ちなみに僕はラベンダー系の香りはずっと苦手だったのですがこれは大丈夫。
  • インプットとアウトプットは同時にやらない。これまでは勉強しながらメモがてらブログを書いていたけど、やっぱり理解力が足りない気がしていた。メモはメモ、アウトプットはアウトプットにちゃんと分けるように。
  • 音楽聞きながら、はモノによってはむしろ加速度を高めてくれる。ということで、僕の場合、クラシックは少し眠くなるので、ボーカルの入っていないJazzのインストもの、特に多少アップテンポなものをチョイス。
  • ホームライブラリー化に本棚を検討。部屋が狭くて本棚をおくと圧迫感が出るのが嫌だったのだけど、本が並んでる姿を見て雰囲気を出すのも重要かも。IKEAだと、BILLYのホワイトが安くて良さげ。
  • もう少し行きつけのカフェとかは開拓したい。会社帰りだと、丸ビル前のシアトルズ・ベスト、ちょっと足を伸ばして、肥後橋のスタバ(ここは2階が空いていて結構穴場)あたり。ただやっぱり梅田近辺なのでいつも混んでる。京橋近辺で静かでPC立ち上げて長居できそうなところを見つけたい。
  • 読書投資基準の70:20:10モデルを僕自身に照らし合わせてみると、サーバ系70、プログラミング系20、その他10って感じにすべきなのかな。ちょっとプログラミング系が多い最近だけど。一応、時間割的に通勤時の読書は技術書以外っていうのを意識してるのでOK。
  • 年間読書キャンペーンは、一つのプログラミング言語をきちんと学ぶには最低1年ぐらいは必要だと思うので、ちょうどよし。今年の年末までにはLinuxカーネルソースをなんとか読めるぐらいになりたい!
  • 生涯読書ランキング作ろう。ランキングは読書だけに限らず、選ぶ作業自体がかなり楽しい。モチベーションあがる。
  • 読書記録をきちんとつけて、自分の読書傾向を分析、自分が今読んでる本のレベルから特定の分野の理解度がどこまで進んでいるか?とか、逆に足りない範囲はどこか?とか、を把握するのは良いかも。メディアマーカーお試し中。
  • 目次読書→スキミング→特定の箇所だけピックアップして読む、この流れを忘れずに、要点の把握とスピードアップ。技術書の場合でもこれは使えるはず。伊藤直也さんトークセッションでもあったのだけど、「繰り返し」のスピードを上げて理解力を上げるほうにポイントを置きたい。
  • 目的意識は常に念頭に。技術書の場合はもちろんその技術の習得が目的なのだけど、その技術を使って何をするか?を常に考えるようにしないと。
  • 読書キット作成しました!100円ショップでほぼ揃います。個人的に失敗したのは、キットを入れる入れ物として布製・メッシュのやつを選んだのだけど、取り出すとき本の重みで形が崩れる。電車の中とかではちょっとつらい。ビニールの多少固めのものを選んだほうがベター。
  • アウトプットへのこだわりを持つ。文体とか情報の精度とか。
  • ホームグラウンドはやっぱり技術。常に理論から仮説をたてて実践するという日々の運用やトラブル対応の基本を読書の中にも持っておきたい。
  • アウトプットが大前提。

うん、小山さんの『STUDY HACKS!』に引き続き、今回も良書でした。『〜 HACKS!』系は読みやすい上に外れを感じないです。とりあえずアウトプットは常に念頭にある状態にはなっているので、もっとアウトプットのスピードとクオリティを上げることが個人的にはテーマかな。

[時間割:Perl]『ミニマルPerl』その6
2008/10/28 01:49 posted by kunkichi

火曜日は『Perl』の時間です。行をまたがる正規表現のところから。

  • 普通は . でニューライン(¥n)はとれないのだけど、シングルラインモードを使えば¥nもマッチ対象とすることができる。これを使って複数行にまたがるマッチングを行う。$ cat lines.txt
    abcde fghij
    klmno pqrst
    uvwxyz
    $ perl -00 -wnl -e '/\bfghij\b.*\bklmno\b/si and print $&;' lines.txt
    fghij
    klmno
  • ポイントは以下。
    • 入力レコードセパレータを-00とか-0777とか複数行読み込めるものにする。
    • マッチ修飾子にシングルラインモード(s)を有効にして、¥nがマッチするような正規表現を書く。*. とか。
  • いろいろ試してみる。BINDのqueryログから、問い合わせホスト名が2文字のTLDで終わっているものを参照。$ perl -wnl -e '/query: \S+\.[a-z][a-z] /i and print;' query.log27-Oct-2008 23:28:02.221 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: atode.cc IN A +
    27-Oct-2008 23:54:14.192 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: www.uniqlo.jp IN A +
    27-Oct-2008 23:59:02.339 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: www.oreilly.co.jp IN A +
    さらに.jpドメインのものを除外する。$ perl -wnl -e '/query: \S+\.[a-z][a-z] /i and ! /query: \S+\.jp /i and print;' query.log27-Oct-2008 23:28:02.221 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: atode.cc IN A +
  • String::Approxを使ってファジーマッチングも可能。# cat fuzzy_match
    ----------
    #!/usr/bin/perl -s -wnl
    use String::Approx 'amatch';
    amatch $pattern, [ "i", "20%" ] and print;
    ----------
    echo "yafoo" | ./fuzzymatch -pattern='yahoo'
    yafoo
  • スクレイピングの例。www.php.netの右上にあるStableのバージョンのうち、5.X系のバージョンを取得する。$ lwp-request -o text www.php.net | perl -wnl -e '/Stable/ and /5\.\d\.\d/ and print $&;'
    5.2.6

以下、grep処理のまとめ

grepコマンド Perlでの書き方
grep ‘〜’ perl -wnl -e ‘/〜/ and print;’
grep -v ‘〜’ perl -wnl -e ‘/〜/ or print;’
grep -i ‘〜’ perl -wnl -e ‘/〜/i and print;’
grep -l ‘〜’ perl -wnl -e ‘/〜/ and print $ARGV and close ARGV;’
fgrep ‘〜’ perl -wnl -e ‘/¥Q〜¥E/ and print;’

シチュエーションによってはgrepのほうが簡単な場合もあるけど、まあそこはケースバイケースで。ちょくちょく使って慣れていこう。。

[時間割:C言語]『はじめてのC言語完全入門』その8
2008/10/25 22:49 posted by kunkichi

今週の頭は少しサボっちゃいましたが、気を取り直して。サボりの元凶となったのは Touch Diamond を買ったから(笑)ですが、遊びのために買ったんじゃない、ということを証明するために早速、金曜日の会社帰りに外で勉強しました。やっぱり外ははかどるな〜、3章一気に進んじゃったし。

ということで、木・金のアップです。まずは『C言語』の方から。

はじめてのC言語 完全入門 (標準プログラマーズライブラリ)
塚越 一雄
技術評論社
売り上げランキング: 420963


関数

  • Cの場合、関数の定義には、以下が必要。
    • 関数名
    • 関数の型。返り値の型を決める必要がある。
    • 引数。
    • 関数値。いわゆる、返り値。

    なんといっても、「型」が必要ってところが、PerlとかPHPとかとの最大の違い。

  • 返り値がない場合は、型にvoid を指定する。でもってreturnは値を指定しないか、returnそのものを省略できる。
  • ただし、void型関数の途中で終了する場合は、returnを使う。
  • 引数なしの場合は、voidを使う。voidを使わずに()だけで書いた場合は、引数がないのではなく、コンパイラが引数のチェックをしない、という意味になるので注意。
  • 関数を定義する場所は、
    • 関数が呼び出される場所よりも前に書く(Pascal方式)。シェルスクリプトはこっち。
    • 関数が呼び出される場所よりも後に書く(C方式)。ただしこの場合は、呼び出される前にプロトタイプ宣言が必要。
  • プロトタイプ宣言は、関数の使い方のチェックを行うためのもの、と言える。
  • static変数とauto変数の違い。
    • auto変数は、関数呼び出し時に初期化され、関数終了時に消滅する。#include <stdio.h>
       
      void auto_hensuu();
       
      int main()
      {
        auto_hensuu();
        printf("----------\n");
        auto_hensuu();
        return 0;
      }
       
      void auto_hensuu()
      {
        int i,num = 0;
        for(i=0; i<10; i++){
          printf("auto関数 %2d 回目: num  = %d\n", i +1 , num );
          num += 10;
        }
        return;
      }
      実行結果:$  ./kansuu
      auto関数  1 回目: num  = 0
      auto関数  2 回目: num  = 10
      auto関数  3 回目: num  = 20
      auto関数  4 回目: num  = 30
      auto関数  5 回目: num  = 40
      auto関数  6 回目: num  = 50
      auto関数  7 回目: num  = 60
      auto関数  8 回目: num  = 70
      auto関数  9 回目: num  = 80
      auto関数 10 回目: num  = 90
      ----------
      auto関数  1 回目: num  = 0
      auto関数  2 回目: num  = 10
      auto関数  3 回目: num  = 20
      auto関数  4 回目: num  = 30
      auto関数  5 回目: num  = 40
      auto関数  6 回目: num  = 50
      auto関数  7 回目: num  = 60
      auto関数  8 回目: num  = 70
      auto関数  9 回目: num  = 80
      auto関数 10 回目: num  = 90
      2回目の関数呼び出し時に変数が初期化されている。
    • static変数は、プログラム実行時に初期化され、プログラム終了時に消滅する。#include <stdio.h>
       
      void static_hensuu();
       
      int main()
      {
        static_hensuu();
        printf("----------\n");
        static_hensuu();
        return 0;
      }
       
      void static_hensuu()
      {
        int i = 0;
        static int num = 0;
        for(i=0; i<10; i++){
          printf("static関数 %2d 回目: num  = %d\n", i +1 , num );
          num += 10;
        }
        return;
      }
      実行結果:$ ./kansuu2
      static関数  1 回目: num  = 0
      static関数  2 回目: num  = 10
      static関数  3 回目: num  = 20
      static関数  4 回目: num  = 30
      static関数  5 回目: num  = 40
      static関数  6 回目: num  = 50
      static関数  7 回目: num  = 60
      static関数  8 回目: num  = 70
      static関数  9 回目: num  = 80
      static関数 10 回目: num  = 90
      ----------
      static関数  1 回目: num  = 100
      static関数  2 回目: num  = 110
      static関数  3 回目: num  = 120
      static関数  4 回目: num  = 130
      static関数  5 回目: num  = 140
      static関数  6 回目: num  = 150
      static関数  7 回目: num  = 160
      static関数  8 回目: num  = 170
      static関数  9 回目: num  = 180
      static関数 10 回目: num  = 190
      2回目の呼び出し時に1回目の処理終了時の変数をそのまま引き続き使用している。
  • 値を返さないvoid型関数は値を取るような処理では使えない。結果を代入するとか、結果を出力するとか(もちろん関数内で出力することはできる)。逆に値を返す関数は、値を取らない処理でも使える。
  • べき乗を計算するpow()を使う場合は、math.hをインクルードする。
  • 引数を取る関数は、仮引数を定義しなければいけない。その場合、仮引数の型も合わせて定義する。
  • プロトタイプ宣言している場合は、そちらにも引数をちゃんと指定すること。

スコープ

  • 関数内の変数は関数内にのみ限定される(ローカル変数)。
  • 実際には「ブロック」内、つまり{}で囲まれた範囲内に限定されているのがローカル変数。
  • 関数の外側の変数は、関数から見た場合にはグローバル変数となり、参照可能。
  • 変数名もブロック内に限定されるので、他の関数内で同じ変数名が使用されていても衝突しない。
  • ただし、グローバルな変数名と同じ名前にした場合、関数内ではローカル変数が優先される。
  • グローバル変数はファイルスコープ。

配列

  • 配列にも型の概念がある。すなわち、同じ型のデータしか入れれない。異なる型のデータを入れるのは構造体。
  • 配列は、基本の型とは異なるユーザ定義型の一つ。
  • 配列を宣言するには、型・配列名・サイズ(要素数)をあらかじめ定義する。int ary[10]
  • 初期値を与えることもできる。int ary[] = { 1, 2, 3 };この場合はサイズの指定は不要(自動的に初期値の個数がサイズとなる)
  • 配列の要素へのアクセスは、インデックスを使う。x = ary[0];
  • 配列全体のメモリ量を求めるには 配列に対して sizeof を使う。sum = sizeof ary;
  • 配列要素の単体メモリ量を求めるには 配列のインデックス0 に対して sizeof を使う。each = sizeof ary[0]
  • つまり、全体メモリ量を単体メモリで割ると、配列の要素数を求めることができる。num = sizeof ary / sizeof ary[0];forループの上限値等に設定する場合はこれをつかうとよろし。
  • forループの脱出にもbreakが使える。
  • ループの脱出にはbreakを使う。
  • 配列はあらかじめサイズを指定しておかないといけないため、途中でサイズが大きくなった場合に対応できない。こういう場合は動的メモリが必要となる。

ふぅ、たくさん進んだ分、アウトプットも多くなってしまいましたが、これで教科書の残り3分の1まで来ました。やっと終わりが見えてきたのでがんばります。次はいよいよ「ポインタ」です!

[時間割:Perl]『ミニマルPerl』その5
2008/10/15 02:05 posted by kunkichi

さて、祝日分のアップをします。まずは『Perl』から。

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 96883
  • 正規表現でこれまでは、デリミタに¥s+、数値に[0-9]とかでベタに指定してたけど、これからは¥bとか¥dとか使おう。
  • fgrepみたいな、メタキャラクタをそのままリテラルで使う場合は、¥Q…¥E。
  • マッチした部分を取り出す場合は、$&を使う。$ echo "12345 123 abced abc" | perl -wnl -e '/\b\d\d\d\d\d\b/ and print $&;'
    12345
  • マッチしない場合(grep -v)は、orを使う。$ echo "12345
    > 123
    > abcde
    > abc" | perl -wnl -e '/\b\d\d\d\d\d\b/ or print;'
    123
    abcde
    abc
  • 合致するファイル名だけを出力する(grep -l)の場合は、$ARGVでファイル名を取得。perl -wnl -e '/\b\d\d\d\d\d\b/ and print $ARGV and close ARGV;' aaa bbb ccc
    aaa
    最後にcloseしているのは、合致する文字列が複数業あった場合にファイル名が2重に出力されるのを防ぐために、合致した時点でcloseして終わるため。
    ちなみに、closeしないとこうなる。$ perl -wnl -e '/\b\d\d\d\d\d\b/ and print $ARGV;' aaa bbb ccc
    aaa
    aaa
  • 大文字小文字を無視する(grep -i)の場合は、マッチ修飾子iを使う。$ echo "aaa
    > AAA
    > bbb
    > BBB" | perl -wnl -e '/aaa/i and print;'
    aaa
    AAA
  • egrep的だったり、パイプを使った段階的フィルタ、みたいなのはperlだと簡単。perl -wnl -e '/aaa/ and
      /bbb/ and
        /ccc/ and
          /ddd/ and
            print;' sample.txt
    パイプで書くとgrep "aaa" sample.txt | grep "bbb" | grep "ccc" | grep "ddd"メモリ消費やポータビリティの点でPerlのほうがらくちん。
  • 行単位じゃなくて、複数行でのマッチングも簡単。まずは段落。以下のようなldifファイルがあるとして、$ cat sample.ldif
    dn: uid=test1,ou=people,dc=example,dc=com
    uid: test1
    objectclass: posixAccount
    objectclass: account
    userPassword:password1
    loginshell: /bin/bash
    uidNumber: 201
    gidNumber: 201
    homeDirectory: /home/test2
    gecos: test1
    description: "Test User 1"
     
    ・・・
     
    dn: uid=test3,ou=people,dc=example,dc=com
    uid: test3
    objectclass: posixAccount
    objectclass: account
    userPassword:password3
    loginshell: /bin/bash
    uidNumber: 203
    gidNumber: 203
    homeDirectory: /home/test3
    gecos: test3
    description: "Test User 3"
    uidがtest2のレコードを抽出。$ perl -00 -wnl -e '/uid: test2/ and print;' sample.ldif
    dn: uid=test2,ou=people,dc=example,dc=com
    uid: test2
    objectclass: posixAccount
    objectclass: account
    userPassword:password2
    loginshell: /bin/bash
    uidNumber: 202
    gidNumber: 202
    homeDirectory: /home/test2
    gecos: test2
    description: "Test User 2"
  • 今度はさっきのレコードがそれぞれ独立したldifファイルだった場合。この場合はファイルモードを使う。$ perl -0777 -wnl -e '/uid: test2/ and print;' test1.ldif test2.ldif test3.ldif結果は上と同じ。

ここまでは今までにも出てきてるので問題ないね。段落モードとか実際に使えそうなシチュエーションを想定してやってみました。

さて、次回は、「行をまたがる正規表現」からです。これは結構必要となるシチュエーションが多いので重要ですね。

このページの先頭へ