注意:
したがって,テキストを構成する行が,1つ以上の「文」から成っている『長大な行』のとき(文の終了を示す『.』や『。』の後にも,改行せずに文が続いているとき),長大な1行の中の後に続く「文」が検索対象とはならない可能性が大きくなったり,また,文に対する一括処理が困難となる. 電子メールの文などの特別な場合を除いて,LaTeX文書やHTML文書では必ず1つの「文」ごとに改行すること. また,考えもなく行頭に空白文字をいれるようなことも慎むこと.
「Apple」と「Apple」のように全角文字(漢字モード入力)と半角文字を『無節操に混在させた文書は最悪』で,情報検索の媒体としての価値がなくなってしまう. テキスト入力の際には注意すること(今ある文書はどうしよう?).
% grep [オプション] パターン ファイルである.
パターンとして後述する正規表現を使ってパターンマッチさせると強力な処理を行うことができるが,正規表現を使わなくてもgrepは有用である.
grepでは,一般に複数のファイルを対象とする. たとえば,ファイル名として*.txtとすれば,拡張子.txtのついたファイル群が対象となる.
grepの主なオプションは以下の通り.
オプション | 意味 |
---|---|
-c | マッチした総行数の表示 |
-i | 大文字小文字を区別しない |
-n | 行番号をつけて表示 |
-v | 指定したパターンを含まない行だけを表示 |
-l(エル) | 指定したパターンを含むファイル名だけを表示 |
以下の例では,検索対象となるファイル群があると思われるディレクトリにワーキングディレクトリを既に移動しているとする. そうでなければ,検索ファイル(群)の指定には目的とするディレクトリまでのディレクトリパスも指定する必要がある.
演習:以下を実際に実行し,結果出力をよく「観察」せよ.
% grep BODY *.html特定のファイルだけを探そうとする場合,多くのファイルにマッチしてしまったときには,パターンの指定を工夫して(条件を厳しくするなどして)候補となるファイルを絞り込む.
こうして見当をつけた少数のファイル群を cat やページャである less や more を使ってファイル内容を表示して,探しているファイルを特定する.
% grep -n BODY *.htmlオプション -n をつけるとマッチした行の行番号を表示する.
% grep -i BODY *.htmlオプション -i はパターン文字列の大小を無視する. HTMLタグに使われる英字は大小文字には無関係である(<BODY>と<body>は同じ意味である)
% grep -in '<TITLE>' *.html記号 < や > はシェルではリダイレクション記号として使われる. これを抑制して「文字」としてパターンに含めるには引用符記号『'』で囲む必要がある.
% grep -ic '<A HREF' index.htmlマッチした行が何行かを表示するには,上のようにオプション -c を付ける. パターンに空白が含まれているときも引用符『'』で囲む.
% grep -i '<A HREF' index.html | wc -l出力結果を単語数や文字数を表示するコマン wc にパイプして行数を数えるオプション -l(エル)をつける.
検索対象となるファイル群が莫大であったり,ファイルサイズが巨大である場合(インターネット時代では,特殊な状況ではない!),こうした状態に遭遇する機会は多くその対処法が重要な情報処理技法の1つとなることに注意.
- 主題の推測:キーワード候補
- 対象となるファイルは指定したパターンをキーワードとして持つ可能性があると推測できる.
- パターンをさらに工夫する
- 探し出したい行(文書部分)をすばやく見出したいのであれば,条件を厳しくするように指定パーターンをさらに工夫する.
- フィルターの追加
- あるいは,さらに別のフィルターにパイプして,必要な情報を漉しとる.
検索パターンを工夫して目指すパターンを含む行を探し出すためには,通常は正規表現を利用する. たとえば,行頭でAppleを含む行を表示するには,次のようにする. 記号『^』を使っていることに注意する.
% grep '^Apple' target.txt正規表現をパターンとするときにも,引用符『'』で囲んでいることに注意する(シェルにエスケープ記号などを解釈されないようにするため).
grepのパターンには,次の表にあるような正規表現を使うことができる. ただし,パターンが正規表現のときにはパターンを引用符『'』で囲む.
式 | 意味 |
---|---|
c | メタ文字でない文字"c"はその文字自身を表す |
\m | メタ文字"m"のその文字自身を表す |
^(ハット) | 行頭を表す |
$ | 行末を表す |
.(ピリオド) | 任意の1文字を表す |
[c1c2....cn] | 文字集合c1c2...cnの中の任意の1文字 |
[c1-c2] | c1からc2までの文字範囲の中の任意の1文字 |
[^c1c2...cn] | c1c2...cnのどれでもない任意の1文字 |
r* | 正規表現rの0回以上の繰り返しを表す |
r1r2 | 正規表現r1に正規表現r2が続く並びを表す |
\(r\) | タグ付き正規表現r(正規表現のグループ化)を表す |
\N | N番目のタグ付き表現がマッチした文字列を表す. |
grepで使えるメタ文字は次の7つである.
メタ文字を普通の「文字」としてパターン内で使うためには,上の表にあるように,バックスラッシュ記号『\』を付けてメタ文字の意味をエスケープ(escape:本来の意味を逃がすの意)する. この意味で,メタ文字をエスケープ記号ということがある.\ ^ $ . [ ] *
演習
% grep '<H2>' *.html
%grep -i '<ol>' *.html
% grep "^<P>' *.html
grep -n '<P>$' *.html
課題: