はじめに
初めまして、mirankoといいます。
今回はgrepコマンド大全、というよりは今業務で使っている最低限のgrepコマンドについて紹介していきます。
対象者
新卒~2年目程度のレベル感を想定しています。grepをオプションなしで実行しているままの人もとっかかりにはなるはずです。
目次
1 -i 大文字小文字を区別しない
2 -r フォルダ内を再帰的にgrep
3 -v 除外
4 -n 行番号表示
5 --include 対象ファイルの条件指定
6 --exclude 除外ファイルの条件指定
1 -i 大文字小文字を区別しない
iオプションは大文字小文字を区別しないため、例えばソースコードの中から「qiita」という文字を探すとき以下のような具合で検索結果が変わります。特に業務用語をクラス名や変数名にしている場合、人によって大文字小文字のつけ方が違う場合があるため、基本iオプションはつけるのが吉です。
- iオプションをつけたとき
$ grep -i qiita grep.txt
qiita
Qiita
QIITA
QiiTa
- iオプションがないとき
$ grep qiita grep.txt
qiita
2 -r フォルダ内を再帰的にgrep
こちらも基本的につけるオプション。再帰的(今の階層より深い階層すべてのファイルを対象)にgrepを実行します。findと少し似てますね。
3 -v 除外
-v をつけると、通常とは逆に除外するキーワードを指定できます。
例えばHTMLファイルのinputタグのうちbutton以外を検索結果として得たいのであれば、
grep "input" | grep -v "button"
とすることで 「input」の検索結果から「button」が含まれる行を除く結果 を抽出できます。
-vは「除外モード」のような挙動なので、以下のようにして除外したいキーワードを複数並べることもできます。
grep -v "AAA" "BBB" ファイル名
もしくは
egrep -v "AAA|BBB" ファイル名
といった風に書くこともできます。|(パイプ)でまとめるには -Eでの正規表現モードONかegrepを使う必要があります。
4 -n 行番号表示
-nをつけると抽出結果に行番号が合わせて出力されます。grepした結果に該当する行を修正したいといったケースで有用です。
$ grep -n "ii" grep.txt
1:qiita
2:Qiita
4:QiiTa
ファイル名無しの場合は以下のように「ファイル名:行番号:実際の行」で出力されます。
$ grep -rn "ii"
grep.txt:1:qiita
grep.txt:2:Qiita
grep.txt:4:QiiTa
このgrep結果をExcelに貼り付けたい、といった場合には:(コロン)をTabに置換すると、Excel上で別のセルに分かれて貼り付けできます。
5 --include 対象ファイルの条件指定
--includeオプションは抽出対象ファイルをより細かく指定できます。
例えば、jsp、js、cssの入ったWebContentフォルダに対して、jspだけ対象にgrepしたい、という場合は以下のようになります。
grep -r "input" --include="*.jsp"
*は任意の、という意味なので、拡張子がjspのファイルに限定してgrepする、というような使い方ができます。
includeの指定が複数ある場合は、""ではなく{}を用います。
grep -r "tokyo" --include{*.jsp,*.js}
この場合は、任意のjspファイル、任意のjsファイルに限定してgrepを行っています。
対象ファイルが絞り込めているのであれば、grep段階から絞り込んでしまうのがよいです。
6 --exclude 除外ファイルの条件指定
--excludeはincludeとは逆で、除外したいファイルの条件を指定します。
明らかに関係ないファイルは除きたいけれど、対象ファイルははっきり絞り込めていない、という場合には一旦excludeで除外した抽出結果を精査して、真に必要な条件を狭めていくとよいでしょう。
例としては以下のような形です。classファイルやTestクラスのjavaファイルを除外しています。
grep -r "Tokyo" --exclude={*.class,*Test.java}
まとめ
最低限1~6のオプションを知っていれば、grepを使い始めて半年1年レベルにはなれるのではと思います。他にもファイル名のみ出力する-lオプションなど使えるオプションはありますし、grepとsedを組み合わせる、psコマンドの結果をgrepするといった組み合わせによりさらにできるようになることも無限にあるので、ぜひ使いこなせるようになりましょう!
終わりに
これはよく使う、といったgrepコマンドオプション、組み合わせるコマンドあればコメント頂けますと幸いです!