ヒント: catを使ってファイルを連結する

textutilsに通じる

GNUのテキスト・ユーティリティーについての連載第2回目として、Jacek Artymiakが、catコマンドを取り上げます。UNIXを愛する人からはこよなく愛され、UNIXを嫌いな人からはこよなく嫌われるコマンドです。

Jacek Artymiak (jacek.artymiak@linuxworld.com), LinuxWorld columnist, LinuxWorld

Jacek Artymiak はフリーランスのコンサルタント兼ライターです。最新の著作としてStarOffice for Linux Bible (IDG Books Worldwide) およびInstall, Configure, and Customize Slackware Linux (PrimaTech) があります。また、家庭およびオフィスの Linux ユーザー向けの Linuxapprentice.com ニュースレターの発行者でもあります。連絡先はjacek.artymiak@linuxworld.com です。



2002年 10月 01日

よく、いくつかのファイルをまとめて処理し、その結果を1個の出力ファイルに保存したいことがあります。cat コマンド (concatenateの略) は、1つまたは複数のファイルを入力にとり、それらのファイルを1個のファイルとして出力に表示 (print) します。たとえば、cat chapter01 chapter02 chapter03 > book とすると、3個のchapterXX ファイルが1個のbook ファイルに保存されます。

入力ファイルは、cat コマンドの後に続けて指定された順に表示されますので、データの順序を逆にするには、入力ファイルの指定の順序を逆にする必要があります。また、処理すべきファイルの数が多すぎて手入力でファイル名をタイプするのが大変な場合には、cat chapter* > book のようにワイルドカードを使うことができます。このとき、ファイル名は昇順に並べ換えられます。これによって、chapter13chapter02 より後に 出力されるのに、chapter2 よりは前に 出力されてしまうような面白いことが起こったりします。

cat の出力をファイルや他のコマンドの標準入力にリダイレクトしなければ、cat は、ほとんどのコマンド・ライン・ツールと同様な振る舞いをし、出力をコンソールに送ります。したがって、cat を使ってファイルを表示することができます。たとえば、cat /etc/passwd とすれば、システム・パスワード・ファイルの内容を表示させることができます。大きいファイルは、less /etc/passwd のように、less を使って表示させると便利です (less の詳しいことについては、man less で調べてください)。

cat は、主にファイルの連結に使用されますが、入力に対する簡単な自動の処理に利用することもできます。たとえば、複数の空行を除去して1個の空行にするといったことができ (-s オプションを使う)、ソース・コードを小ぎれいにしてから表示するのに便利です。残念ながら、cat には、空行を完全に消し去ってしまうためのオプションはありませんが、大した問題ではありません。次のように、sed コマンドが都合よく利用できるからです。

リスト1. sedとcatを組み合わせて空行を除去する
$ cat -s /etc/X11/XF86Config | sed '/^[[:space:]]*$/d'
...
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Red Hat 6.0 and later now use a font server independent of
# the X server to render fonts.
    FontPath   "/usr/X11R6/lib/X11/fonts/TrueType"
    FontPath   "unix/:7100"
EndSection
...

configファイルやHTMLページのソースで、とりわけ不必要な改行を入れるスクリプトで生成されたファイル、あるいは大きな条件構造を含んでいて、条件の区切りに空行を使っているようなソースを読むときには、空行を圧縮すると、簡単に読みやすくすることができます。

cat には、また、行に番号を振るという重要な機能もあります。これは、プログラム解説文書とか法的な文書や科学文書の出力に重宝する機能です。左端に行番号を示すことで、文書内の位置を簡単に指し示すことができます。プログラミング、科学研究、ビジネス・レポート作成、あるいは法的文書作成作業を行う上で、これは非常に重要な意味をもちます。番号の振り方のオプションには、2つがあります。空行以外の行だけに番号を振る-b とすべての行に番号を振る-n です。

リスト2. 行に番号を振る
$ cat -b /etc/X11/XF86Config
...

    14  # Multiple FontPath entries are allowed (they are concatenated together)
    15  # By default, Red Hat 6.0 and later now use a font server independent of
    16  # the X server to render fonts.
    17      FontPath   "/usr/X11R6/lib/X11/fonts/TrueType"
    18      FontPath   "unix/:7100"
    19  EndSection
...
$ cat -n /etc/X11/XF86Config
...

    20  # Multiple FontPath entries are allowed (they are concatenated together)
    21  # By default, Red Hat 6.0 and later now use a font server independent of
    22  # the X server to render fonts.
    23  24      FontPath   "/usr/X11R6/lib/X11/fonts/TrueType"
    25      FontPath   "unix/:7100"
    26  27  EndSection
...

cat は、また、タブなどの非印刷文字 (non-printing character) を含んでいるファイルを表示させる場合にも役に立ちます。以下のオプションで、これらの文字を確認できます。

  • -T は、タブを^I として表示します。
  • -v は、ライン・フィードとタブ以外の非印刷文字を、それに対応する「コントロール・シーケンス」で表示します。たとえば、Windowsシステムで作成されたファイルを処理する場合、コントロール-M (^M) 文字で行の終わりが示されます。127よりも大きいコードの文字の前には、「メタ」の意味でM- が付けられます。これは、他のシステムのAlt- 文字に相当するものです。
  • -E は、各行の最後にドル記号 ($) を付加します。
リスト3. 非印刷文字の表示
$ cat -T /etc/X11/XF86Config
...
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Red Hat 6.0 and later now use a font server independent of
# the X server to render fonts.

^IFontPath^I"/usr/X11R6/lib/X11/fonts/TrueType"
^IFontPath^I"unix/:7100"
EndSection
...

$ cat -E /etc/X11/XF86Config
...
# Multiple FontPath entries are allowed (they are concatenated together)$
# By default, Red Hat 6.0 and later now use a font server independent of$
# the X server to render fonts.$
$
    FontPath   "/usr/X11R6/lib/X11/fonts/TrueType"$
    FontPath   "unix/:7100"$
$
EndSection$
...
$ cat -v /etc/X11/XF86Config
...
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@M-|M-8^X^@^@^@
P^@^O"M-X^O M-@^M^@^@^@M-^@^O"M-@M-k^@M-8*^@
@M-^H$M-@M-9|A(M-@)M-yM-|M-sM-*M-hW^A^@^@j^@
M-|M-sM-%1M-@M-9^@^B^@^@M-sM-+fM-^A= ^@ ^@
F^@^@   ^@M-9^@^H^@^@M-sM-$M-G^E(l!M-@M-^?
^IM-A5^@^@^D^@PM-^]M-^\X1M-H%^@^@^D^@tyM-G
...

次回は、headtail を取り上げたいと思います。それでは、また。ところで、質問やご意見をお持ちの方は、ぜひお聞かせください。jacek@artymiak.com までメールをいただければ幸いです。

参考文献

  • Jargon Fileのcatの項目も参考になります。なぜcat が、ユーザー・インターフェース設計の優れた例であるとみなされる一方で、悪いユーザー・インターフェース設計の典型だとみなされているのかを知ることができます。
  • textutils と呼ばれ、愛されているこれらのツールの詳細については、GNUテキスト・ユーティリティー・マニュアル を参照してください (MITには、同じ目次の展開型表示バージョン があります。MITのサイトには、さらに数多くの便利なGNUツールの素晴らしいリスト も掲載されています)。
  • Windowsユーザー向けには、これらのツールは、Cygwin パッケージとして用意されています。
  • Mac OS Xユーザーの場合、Fink を試してみるとよいでしょう。Mac OS X下に豊富なUNIX環境をインストールしてくれます。
  • 何かうまくいかないことがあるという方、GNU textutilsのFAQ (よくなされる質問)で調べてみてください。
  • 今回取り上げたツールを詳しく研究する前に、入門書的解説を読んでみたいという方、ユーザー向けUNIXhelp から始めてみてはいかがでしょうか。
  • この連載の1回目の記事、textutilsに通じる (developerWorks、2002年10月) も読んでみてください。
  • この分野の古典的な文献に、Jerry Peek、Tim O'Reilly、Mike Loukides共著のUNIX Power Tools があります (O'Reilly and Associates、1997)。ISBN 1-56592-260-3。
  • 皆さんが今探しているLinux関係の参考文献がdeveloperWorks のLinuxゾーンで見つかるかもしれません。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=231473
ArticleTitle=ヒント: catを使ってファイルを連結する
publish-date=10012002