01 / 09
名前を知らないときはどうする
find は名前で探す道具だったね。でも、探し物はいつも名前で覚えているわけじゃないよ。
- 「エラーが出たログはどれだっけ」
- 「あの日ラーメンの話を書いたのは、どの日記だっけ」
こういうときに使うのが grep だよ。ファイルの中身を読んで、その言葉がある行を出す道具なんだ。
探す
INPUT · スライド
01 / 09
find は名前で探す道具だったね。でも、探し物はいつも名前で覚えているわけじゃないよ。
こういうときに使うのが grep だよ。ファイルの中身を読んで、その言葉がある行を出す道具なんだ。
02 / 09
書き方はこうだよ。
```
grep さがす言葉 ファイル
```
出てくるのはその言葉を含む行そのままだよ。行番号でもファイル名でもなく、中身が出る。
ログを見るときの最初の一手は、たいていこれ。何千行あっても、気になる言葉のある行だけが残るよ。
~ $ grep ERROR log/access.log10:02 ERROR disk full10:05 ERROR network down03 / 09
grep は見つからないとき何も出さないよ。エラーも出ない。
最初は「壊れたのかな」と思うけれど、これは「探したけれど無かった」という返事なんだ。find もそうだったね。
UNIX の道具は何も言わないのが good news という作りになっていることが多いよ。うまくいったときは黙る。
04 / 09
grep ERROR は大文字の ERROR しか拾わないよ。error と小さく書かれた行は逃してしまう。
区別せずに探すのが -i だよ。find の -iname と同じ考えだね。
ログを見るときは -i を付ける癖にしておくといい。書いた人によって大文字小文字はまちまちだからね。
~ $ grep -i error log/access.log10:02 ERROR disk full10:04 error timeout10:05 ERROR network down05 / 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 down06 / 09
-v は逆をやるよ。その言葉が無い行を出すんだ。
これは「じゃまなものを消す」ときに効くよ。ログから INFO を消せば、残るのは気にすべき行だけになる。
```
grep -v INFO log/access.log
```
探すのに使うだけじゃなく、要らないものを捨てるのにも使える。これが grep のもう一つの顔だよ。
07 / 09
ファイルを名指しできないときは -r を使うよ。入れ物の中を全部もぐって探してくれる。
```
grep -r ラーメン .
```
出てくる形が変わって、ファイル名:行 になるよ。どのファイルの話かが分かるようにね。
find と grep の使い分けはこう。名前で探すなら 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 は黙る。それも確かめてみよう。