ヒント: textutilsを知ろう

Linuxでのテキスト自動処理についてのヒント・シリーズ -- はじめに

Comments

多くのユーザーは、テキスト自動処理を使うのを敬遠したり、好みのテキスト・エディターの「検索・置換」を代用してごまかしたりしています。それは、利用できるツールについての知識がないためであったり、多くの場合は、sedやAWKやPerlを使い始めるために必要な正規表現を怖がってのことです。

これらのツールがテキスト自動処理で大きな働きをすることは確かですが、すべての作業でそうした重装備が必要とされるわけではありません。多くの問題は、GNU textutilsディストリビューションに含まれている1群のツールを使って解決することができます。これらの便利なテキスト処理プログラム群が、数多くの無料および商用のUnix向けに提供されるようになってから優に10年以上は経ちますが、まだ数多くのユーザーに広く知られてはいません。

このヒント・シリーズの記事では、豊富なソフトウェアを紹介するとともに、これらの標準的なGNUのテキスト・ユーティリティーを利用することでデータ・フローを簡単に制御できるようになることを紹介したいと思います。この入門シリーズの終わりには、皆さんも、テキスト処理ユーティリティー、パイプ、ストリームを使って、複雑なデータ処理システムを構築できるようになっているはずです。また、よくあるシステム管理の繁雑な作業を自動化したり、フォーマット処理を手早く行ったり、「テキスト自動処理」の範疇に入るようなその他の単純で平凡な作業を行ったりするための、1回きりの簡明なスクリプトを記述できるようにもなるはずです。

コマンド・ラインでの作業: 入力と出力、パイプとストリーム

まず最初に、コマンド・ラインでの作業についての基本的な考え方を理解しておく必要があります。そこで、以下にその概略をまとめておきます。すべて、よくわかっているのであれば、それは素晴らしいことです。そうでない方は、稿末に掲げた参考文献をいくつか当たってみることをお奨めします。

テキスト・データ処理用プログラムを作成する開発者は、一般的なソースおよびターゲットとして、ファイルかストリームのいずれかを選択することができます (ここでは、話を簡単にするために、ソケットは除外しておくことにします)。

データ・ストリームを読み込み、結果をストリームに書き出すという方法は、ファイルの大部分をメモリーに読み込む必要がなく、ましてやファイル全体を読み込む必要もないという点で、便利です。通常、何百メガ・バイトもの記憶領域を占めるようなテキスト・ファイルを処理する場合であっても、1行ぶんのテキストを入れておくだけの小さな (ほとんどの場合、わずか数百バイトの) バッファーで充分です。この方法でテキスト処理を行うことのもう1つの利点は、複数のコマンドを連結してパイプにすることによって、あるコマンドの標準出力ストリームからのデータを別の標準入力ストリームに渡すことができることです。この単純な手法を利用すれば、誰でも、単純な構成要素 (building blocks) を使って、複雑なデータ処理システムを構築することができます。

ストリームからデータを読み込んだり、パイプを作成するための記法 (syntax) は、UNIXのすべてのシェルで同じです (筆者は、bash、すなわちGNU Bourne-Again SHellの記法を使用していますが、本稿で紹介している例は、何も手を加えなくても、他の環境でも動かせるはずです)。

すべてのアプリケーションが、たくさんの出力ストリームを設けることができますが、われわれにとって最も関心のあるストリームは、標準出力 (STDOUT) です。UNIXのコマンドは、textutilsパッケージに含まれているものも含め、すべて、他の方法が指示されないかぎり、その結果を標準出力に書き出します。ユーザーがリダイレクトしないかぎり、STDOUTには、通常、コンソールが使われます。同様に、これらのコマンドで処理されるデータの供給元 (source) は、通常、その標準入力 (STDIN) となります。コマンドは、標準入力を通して、他のコマンドのSTDOUTかファイルかキーボードからデータを受け取ります。このメカニズムは、便利であり、システムに多くの資源を要求しません。

UNIX環境では、ストリームを利用することが自然なことですので、ほとんどの場合、ストリームを利用していることを意識することすらありません。たとえば、指定されたディレクトリーの内容を読み出すためのls を実行すると、このコマンドは、それを呼び出したプログラム (シェル) の標準入力にファイルのリストを送ります。

ls が (スクリプトなど) 別のプログラムから呼び出されたときは、出力は、そのプログラムに送られ、必要なら、さらにそのプログラムで加工されることになります。しかし、このために、スクリプトを書く必要はありません。あるコマンドの出力を別のコマンドに伝達 (pipe) するには、パイプ、すなわち| を使えばよいのです。今後、このシリーズでは、このパイプの機能を何度も利用することになります。

要するに

結局、このシリーズは、catとtac、headとtail、sortとuniqを学んでいこうというものです。また、ダンプ (dumping)、折り返し (folding)、分割 (splitting)、インデックス作成 (indexing)、その他、ごく一般的なUNIXやLinuxのテキスト・ユーティリティーの中のいくつかの機能を紹介していこうというわけです。皆さんのコンピューターには、大変便利な小さなコードがいろいろと用意されています。残念なことに、多くの場合、これらのコードも、ほとんど使用されていません。おそらく、自分のやっている作業を理解していない方には、manページは難しすぎるのでしょう。そういうわけで、このシリーズは、ただmanページに示されているオプションを引き写してくるのではなく、一般によく使用されるコマンドの性能を調べることのできるようなシナリオを紹介しながら、それらのコマンドを、いつ、どういうふうに使うのかを実践的な感覚として身につけてもらうためのガイド・ツアーにしたいと思っています。基礎的なことを習得してしまえば、(わかりずらいことの多い) manページも、ずっと簡単に読みこなせるようになるでしょう。

そうしたら、皆さんも、このシリーズに参加してみてはいかがでしょうか。このシリーズが、皆さんのマシンを最大限活用する手助けとなればと思っております。


ダウンロード可能なリソース


関連トピック

  • テキスト・ユーティリティーについての標準的な説明書は、GNUテキスト・ユーティリティー・マニュアル です (同じ内容の展開型表示バージョンがこちらにあります)。このマニュアルは、MITおよびWeb上のあちこちのミラー・サイトに置かれています (皆さんのマシンには、すでにインストールされているかもしれません)。
  • この分野の古典的な文献に、Jerry Peek、Tim O'Reilly、Mike Loukides共著のUNIX Power Tools があります (O'Reilly and Associates、1997)。ISBN 1-56592-260-3。
  • Windowsユーザー向けには、これらのツールは、Cygwin パッケージとして用意されています。
  • Mac OS Xユーザーの場合、Fink を試してみるとよいでしょう。新しいMac OS X下に豊富なUNIX環境をインストールしてくれます。
  • Linuxは、まだ始めたばかりという方、あるいは、WindowsやMacなどの別のプラットフォームでこれらのユーティリティーを使ってみたいという方は、初心者向けの記事UNIXhelp for users に目を通してみてはいかがでしょうか。
  • また、LinuxやUNIXの初心者には、Jargon File (The New Hacker's Dictionary と呼んでいる人もいる) も大いに役立つことと思います。Eric Raymondのtuxedo.orgサイトにオンライン版 (Read it online) があります。
  • developerWorks のLinuxゾーンには、他にもLinux関係の記事が多数掲載されています。

コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=231472
ArticleTitle=ヒント: textutilsを知ろう
publish-date=10012002