ここ数回、フィルタコマンドを紹介しているが、この手のコマンドでは最終的に必ずと言って良いほど「正規表現」が出てくる。正規表現は、通常の文字と「メタキャラクタ」と呼ばれる特殊文字で構成される文字列のパターンで、1つの記述で複数の文字列を表すことができる、言わば圧縮表記のようなものだ。正規表現を使いこなせるようになると、かなり面倒な処理もスクリプトやコマンドで簡単に実行できるようになったりする。

しかし、正規表現は一見すると呪文のようで、表記法を知らない人にとっては本当に意味がわからない。それに、正規表現を使わなくても結構やりたいことはできるのだ。そこで今回は、正規表現を利用する前に覚えておきたいフィルタコマンド「grep(1)」の使い方を紹介する。

大文字と小文字を区別しないオプション「-i」

grep(1)に限らず、何らかのコマンドでキーワード検索したり、単語を置換したりする際、問題になるのが大文字と小文字の区別だ。

しかも、その使い分けは文脈で変わる。文章の初めは最初の1文字だけ大文字になるが、文中にあっても強調するために全て大文字になっていることもある。あらゆるパターンに一致するようにキーワードを指定するとなると、grep(1)コマンドを何度も実行しなければならなくなる。

こうした場合に使えるオプションが「-i」だ。-iオプションを指定すると、指定したキーワードに対して大文字も小文字の検索の対象とする。例えば、次の実行例はgrep(1)で「not」というキーワードを指定し、ログファイルを検索した場合の結果だ。

「not」にだけ一致

ここで、grep(1)コマンドに-iオプションを指定すると、「not」だけでなく「NOT」にも一致するようになる。

「not」にも「NOT」にも一致

ログメッセージには、「ERROR」「Error」「error」のように大文字と小文字の組み合わせが異なる表記が混在することもあるが、-iオプションを指定すれば漏れなく拾えるようになる。grep(1)を使うのであれば、ぜひ覚えておきたいオプションだ。

ほかのコマンドと組み合わせる

UNIX系のOSには、さまざまなコマンドが用意されている。パッケージなどから追加すれば、さらに多くのコマンドを利用できる。しかも、なかにはどんどん機能が追加され、大量のオプションが用意されているようなコマンドもある。

しかし残念なことに、人間はあまりたくさんのオプションを覚えておくことができない。必要に応じてマニュアルを読めば良いのだが、そのマニュアルを読むのが面倒なのだ。そのため、結局よく使うオプション以外は使われなくなっていく。

限られたオプションしか使わずに、どうやって処理をこなすのか? パイプでつないで処理するのである。

例えば、ファイルやディレクトリの詳細情報を一覧で表示するために「ls -l」を実行することはよくあるだろう。ここで「ディレクトリの情報だけ知りたい」としよう。「そういうオプションあったっけな……」とオンラインマニュアルを探すのは効率が悪い。

「ls -l」の出力は、行の最初の1文字がファイルやディレクトリなどの種類を表すという規則があり、ディレクトリは「d」となる。grep(1)では、パターン文字列に「^」を付けて指定すると、行の先頭がそのパターンにマッチする行を表示してくれるので、これを利用してフィルタリングすればよい。

「ls -l」の出力結果から、ディレクトリ情報だけ取り出した結果

コマンドはパイプでどんどんつなげられるので、grep(1)につなげてほかのキーワードでさらに絞り込むことができる。

「ls -l」の出力結果からディレクトリ情報だけ取り出し、さらに名前に「sh」が付くものを絞り込んだ結果

grep(1)にはさまざまな機能が用意されているが、これまで3回に渡って紹介したのは行頭を表現する「^」、行末を表現する「$」、キーワードに一致するものを逆に外す-vオプション、再帰的に検索を実行する-rオプション、大文字と小文字を区別しない-iオプションくらいだ。たったこれだけだが、これらの機能を使うだけでもかなりのことができる。grep(1)は特に便利なコマンドなので、まずはこうした基本となる機能を覚えておいてほしいと思う。