grep
何するコマンド?
書き方
grep [オプション] [検索対象文字列(正規表現可)] [対象のファイル名]
オプション
| オプション | 説明 |
|---|---|
| -a | バイナリファイルもテキストファイルとして扱う |
| -b | 検索結果の各行の先頭にオフセット数とやらを表示する |
| -c | 検索結果にファイル名と行数だけを表示する |
| -d【動作】 | 対象がディレクトリの場合の処理を指定する →「-dread」:ディレクトリをファイルと見なして扱う →「-dskip」:ディレクトリを無視する →「-drecurse」:ディレクトリの中のファイルを読み込む。「-r」指定時と同じ動き |
| -e | 検索する文字列を指定する。省略していーよ |
| -f | 検索する文字列をファイルから(1行ずつ)読み込む。ファイルの中身が「aa(改行)bb」の場合、「aa」にマッチする行と「bb」にマッチする行をそれぞれ検索する |
| -h | 検索結果にファイル名を表示しない |
| -i | 検索する文字列の大文字・小文字を区別しない |
| -l | 検索する文字列があるファイルの名前のみを表示する |
| -n | 検索結果の各行の先頭に行番号を表示する |
| -q | 検索結果を表示しない |
| -r | ディレクトリを指定した場合、その中のファイルをそれぞれ検索する。サブディレクトリがある場合はその中も辿る |
| -s | エラーメッセージを表示しない |
| -v | 検索する文字列に一致しない行を表示する |
| -w | 検索する文字列を単語して含む行を検索する |
| -x | 検索する文字列と1行丸々一致する行を検索する |
| -A【数字】 | 検索する文字列に一致した行と後ろの【数字】行を表示する |
| -B【数字】 | 検索する文字列に一致した行と前の【数字】行を表示する |
| -C【数字】 | 検索する文字列に一致した行と前後の【数字】行を表示する |
| -E | 検索する文字列に「拡張正規表現」とやらを使えるようになる。正規表現のパワーアップ版ですね |
| -H | 検索結果にファイル名を表示する |
| -I | バイナリファイルを無視する |
| -L | 検索する文字列がないファイルの名前を表示する |
| -U | バイナリファイルとして扱う |
| -【数字】 | 検索する文字列に一致した行と前後の【数字】行を表示する |
補足事項
オプションがゲンナリするくらいありますが、あまり気にする必要は ありません。
オプションの多くが検索結果の表示内容を切り替えるオプションです。
検索結果の表示系オプションで覚えておくと便利なのは
・「-c」(ファイル名と行数を表示)
・「-l」(ファイル名のみ表示)
・「-n」(行番号を表示)
くらいですかね。
それ以外は、あまり使いません。
検索結果の表示系以外のオプションでよく使うのも
・「-i」(大文字・小文字を区別しない)
・「-v」(一致しない行を表示)
・「-E」(拡張正規表現を使う)
くらいです。
これだけ覚えておけば、ほぼ困りません。
「-v」オプションなんて何に使うの?と思うかもしれませんが、意外と便利ですよ。
例えば
grep -v 192.168.1.xx access_log
のように指定して、アクセスログから特定のIPアドレスを除外したい場合などに重宝します。
「grep」の解説でめんどっちー部分に「正規表現」があります。
検索する文字列は正規表現を使うことで、あいまいな感じで指定できるのです。
grepで使える正規表現は
| 正規表現 | 説明 |
|---|---|
| . | 任意の1文字 |
| ^【文字】 | 【文字】で始まる |
| 【文字】$ | 【文字】で終わる |
| 【文字】* | 【文字】の0回以上の繰り返し |
| 【文字】\? | 【文字】が0回、または1回 |
| 【文字】? | 【文字】が0回、または1回(拡張正規表現) |
| 【文字】\+ | 【文字】の1回以上の繰り返し |
| 【文字】+ | 【文字】の1回以上の繰り返し(拡張正規表現) |
| 【文字1】-【文字2】 | 【文字1】から【文字2】の間の任意の文字。「a-z」などと使う |
| 【文字1】\|【文字2】 | 【文字1】もしくは【文字2】 |
| 【文字1】|【文字2】 | 【文字1】もしくは【文字2】(拡張正規表現) |
| [【複数の文字】] | 【複数の文字】のどれか1文字。「[ade]」や「[a-z0-9]」などと使う |
| [^【複数の文字】] | 【複数の文字】以外。「[^ade]」や「[^a-z0-9]」などと使う |
| 【文字】\{【数字】\} | 【文字】の【数字】回の繰り返し |
| 【文字】{【数字】} | 【文字】の【数字】回の繰り返し(拡張正規表現) |
| 【文字】\{【数字】,\} | 【文字】の【数字】回以上の繰り返し |
| 【文字】{【数字】,} | 【文字】の【数字】回以上の繰り返し(拡張正規表現) |
| 【文字】\{,【数字】\} | 【文字】の【数字】回以下の繰り返し |
| 【文字】{,【数字】} | 【文字】の【数字】回以下の繰り返し(拡張正規表現) |
| 【文字】\{【数字1】,【数字1】\} | 【文字】の【数字1】回以上【数字2】回以下の繰り返し |
| 【文字】{【数字1】,【数字2】} | 【文字】の【数字1】回以上【数字2】回以下の繰り返し(拡張正規表現) |
| \(【パターン】\) | 【パターン】をひとまとまりとして扱う |
| (【パターン】) | 【パターン】をひとまとまりとして扱う(拡張正規表現) |
などですね
拡張正規表現になると「\」がいらなくなるイメージです。
正規表現を使うときは「'(シングルクォート)」もしくは「"(ダブルクォート)」で囲ってあげないと上手く機能しません。
ご注意ください。
grep -E 'a*' hoge.txt
は正規表現として検索されますが
grep -E a* hoge.txt
は期待通りに動作しません。
長くなりましたが、そんな感じです。
「grep」コマンドを使うときは、正規表現をきっちりマスターする、あるいは割り切って正規表現を使わないの2択になると思います。
正規表現を使いこなせると便利ですが、正規表現を使わなくても便利なコマンドですよ。
