私の場合、テキストファイルの中身から特定の文字列を含む行を抽出したい時は、エディタで行っているのですが、grepコマンドで行うこともできるようです。
知ってはいましたが、やったことがなかったので、やってみました。
ちなみにgrepコマンドは、global regular expression printの頭文字から名付けられたもの。
「グローバル・レギュラー・エクスプレッション・プリントを使ってファイルの中から必要な行を抽出しよう!」と言って何のことか分かる人が一体どれくらいいるのだろうか。10人に1人もいない気がする。これを意訳というか漢字にすると、全体正規表現印刷になるでしょうか。
まあ、どうでもいい話はこのくらいにして…
egrepというe=extended grepつまりは拡張正規表現が使えるコマンドも最近はあるようです(とはいえEオプションを使用するとgrepでも拡張正規表現が使えるようです)よく使いそうな具体コマンドの使用例を、以下に書いてみました。
テキストファイルからerrorという文字列を含む行番号と行を検索する
grep -n error test.txt
↓出力結果↓
9:error
12:errorerror
text.txtファイルの中のerrorを含む行を抽出する。もっとも実用的なコマンドではないでしょうか。
テキストファイルからerrorという文字列を含む行数を表示する
grep -c error test.txt
↓出力結果↓
2
cオプションを使用することで、text.txtファイルの中からerrorを含む行数を表示している。ただし、文字列数ではなく、あくまで文字列を含む行数であることは注意。
テキストファイルからマッチしなかった行を表示する。
grep -v error text.txt
↓出力結果↓
info
INFO
ERROR
debug
DEBUG
INFO
vオプションを使用することで、errorにマッチしなかった行が表示することができた。しかし、大文字のERRORが表示されてしまっている。これも除外したい場合はどうしたらいいのだろうか?こういう場合に拡張正規表現を使って|を使用すればいい↓
テキストファイルから複数文字列とマッチしなかった行を表示する(拡張正規表現を使用)
grep -Ev ‘error|ERROR’ test.txt
↓出力結果↓
info
INFO
debug
DEBUG
INFO
Eオプションを使うことで拡張正規表現を用いて、これでerrorとERORRの文字列を除外した行を抽出することができた。なおegrepを使用すると以下のようにも書くことができる。
egrep -v ‘error|ERROR’ test.txt
ちなみに、以下のように書いても結果は同じになった。
egrep -Ev ‘error|ERROR’ test.txt
であるならば、ふだんからegrepを使用すればよい気がします。逆にgrepに-Eを付ければ、egrepはいらない気もします。なんのために2つあるんだろう…。
テキストファイルから複数文字列とマッチしなかった行を表示する(大文字と小文字を区別しない)
ただ上記の例だと大文字と小文字を区別しないiオプションを使ったほうがよりシンプルです。
grep -iv error test.txt
↓出力結果↓
info
INFO
debug
DEBUG
INFO
コメント