探す

INPUT · スライド

中身の言葉で探す

01 / 09

名前を知らないときはどうする

find名前で探す道具だったね。でも、探し物はいつも名前で覚えているわけじゃないよ。

  • 「エラーが出たログはどれだっけ」
  • 「あの日ラーメンの話を書いたのは、どの日記だっけ」

こういうときに使うのが grep だよ。ファイルの中身を読んで、その言葉がある行を出す道具なんだ。

02 / 09

grep — 中身から行を拾う

書き方はこうだよ。

```
grep さがす言葉 ファイル
```

出てくるのはその言葉を含む行そのままだよ。行番号でもファイル名でもなく、中身が出る。

ログを見るときの最初の一手は、たいていこれ。何千行あっても、気になる言葉のある行だけが残るよ。

~ $ grep ERROR log/access.log10:02 ERROR disk full10:05 ERROR network down

03 / 09

見つからないと、黙る

grep は見つからないとき何も出さないよ。エラーも出ない。

最初は「壊れたのかな」と思うけれど、これは「探したけれど無かった」という返事なんだ。find もそうだったね。

UNIX の道具は何も言わないのが good news という作りになっていることが多いよ。うまくいったときは黙る。

04 / 09

`-i` 大文字小文字を無視する

grep ERROR は大文字の ERROR しか拾わないよ。error と小さく書かれた行は逃してしまう。

区別せずに探すのが -i だよ。find-iname と同じ考えだね。

ログを見るときは -i を付ける癖にしておくといい。書いた人によって大文字小文字はまちまちだからね。

~ $ grep -i error log/access.log10:02 ERROR disk full10:04 error timeout10:05 ERROR network down

05 / 09

旗をいくつか覚える

grep は旗(オプション)を覚えるほど便利になるよ。まずはこの5つ。

  • -n … 行番号を付ける(あとで直しに行けるように)
  • -v … 言葉を含む行以外を出す
  • -c … 行を出さずに数だけ出す
  • -l … 中身ではなくファイル名だけ出す
  • -w … 単語としてぴったりの行だけ

旗はくっつけて書けるよ。-i -n-in と書いてもいい。

~ $ grep -n ERROR log/access.log3:10:02 ERROR disk full6:10:05 ERROR network down

06 / 09

`-v` は「引き算」

-v は逆をやるよ。その言葉が無い行を出すんだ。

これは「じゃまなものを消す」ときに効くよ。ログから INFO を消せば、残るのは気にすべき行だけになる。

```
grep -v INFO log/access.log
```

探すのに使うだけじゃなく、要らないものを捨てるのにも使える。これが grep のもう一つの顔だよ。

07 / 09

`-r` でもぐって探す

ファイルを名指しできないときは -r を使うよ。入れ物の中を全部もぐって探してくれる。

```
grep -r ラーメン .
```

出てくる形が変わって、ファイル名:行 になるよ。どのファイルの話かが分かるようにね。

findgrep の使い分けはこう。名前で探すなら find、中身で探すなら grepだよ。

~ $ grep -r ラーメン nikkinikki/1gatsu.txt:1月5日 ラーメンを食べたnikki/2gatsu.txt:2月14日 ラーメンを作った

08 / 09

流しこんでも使える

grep はファイル名を書かずに、パイプで流しこんでも使えるよ。

```
ls | grep .txt
cat log/access.log | grep ERROR
```

この形がとても大事なんだ。ほかの道具の結果を grep で絞れるということは、どんな出力でもふるいにかけられるということだからね。

つなぐ話は次の章でくわしくやるよ。

09 / 09

さあ、打ってみよう

log/access.log に 7 行のログが入っているよ。ERROR が大文字で2行、小文字の error が1行あるよ。

nikki には日記が2つ。両方に「ラーメン」の話が書いてあるよ。

見つからないときは grep は黙る。それも確かめてみよう。