Hack 17. Grep コマンド

grep コマンドはファイルから指定したテキストを検索するために使用されます。
これは信じられないほど強力なコマンドでたくさんのオプションがあります。

Syntax: grep [options] pattern [files]


ファイル上の指定したキーワードにマッチするすべて行をみつけるにはどのようにできるでしょうか?
この例では、grep は /etc/passwd ファイルの中のテキスト John を検索します。
マッチした行をすべて表示します。

# grep John /etc/passwd

jsmith:x:1082:1082:John Smith:/home/jsmith:/bin/bash
jdoe:x:1083:1083:John Doe:/home/jdoe:/bin/bash

オプション -v はマッチしたもの以外の行をすべて表示します。
以下の例では、/etc/passwd から John にはマッチしない記録すべてを表示します。
注意: /etc/password にはいくつか行がありますが、John という単語を含んでいません。
出力の最初の行は以下のようになります。

# grep -v John /etc/passwd

jbourne:x:1084:1084:Jason Bourne:/home/jbourne:/bin/bash


指定したファイルでテキストパターンマッチするのは何行でしょうか?
以下の例では、/etc/password ファイル内に john というテキスト を含むトータルの行数を表示します。

# grep -c John /etc/passwd
2

オプション -cv を指定することで、指定したパターンにマッチしないトータル行数を取得できます。

# grep -cv John /etc/passwd
39


大文字小文字を無視するテキストの検索をどのようにするでしょうか?
オプション -i (ケースを無視)を渡します。
検索中は大文字小文字が無視されます。

# grep -i john /etc/passwd

jsmith:x:1082:1082:John Smith:/home/jsmith:/bin/bash
jdoe:x:1083:1083:John Doe:/home/jdoe:/bin/bash


指定したパターンにマッチするテキストをすべてのサブディレクトリから検索するには?
オプション -r (再帰) を使用します。
以下の例では、/home/users 下のすべてのディレクトリから大文字小文字を無視して
テキスト "john" を検索します。
"ファイル名: パターンにマッチした行" という形式で出力されます。
オプション -l を渡すこともできます。
これはパターンにマッチしたファイル名のみ表示します。

# grep -ri john /home/users /home/users/subdir1/letter.txt:John, Thanks for your contribution.

/home/users/name_list.txt:John Smith
/home/users/name_list.txt:John Doe

# grep -ril john /root /home/users/subdir1/letter.txt

/home/users/name_list.txt