grepは-oPが至高

こんにちは マネックスラボのMです。

今日はgrepについて語っていきたいと思います。

マネックスラボではMONEX VIEWMONEX VISONMONEX 投資力診断などのサービスを開発していますが
開発の過程でデータ確認を行うことがよくあります。そして私はデータ確認にLinuxコマンドを多用します。

grepはデータ確認に限らず、ログの確認なんかにも多用するかと思います。

例えば、こういうJSONデータがあった場合

"product":{"apple":{"name":"apple","shop":"shop1","price":100},"apple":{"name":"apple","shop":"shop10","price":110},"orange":{"name":"orange","shop":"shop2","price":90},"grape":{"name":"grape","shop":"shop3","price":200}}
appleのデータを抽出しようとして
$ grep apple data1
"product":{"apple":{"name":"apple","shop":"shop1","price":100},"apple":{"name":"apple","shop":"shop10","price":110},"orange":{"name":"orange","shop":"shop2","price":90},"grape":{"name":"grape","shop":"shop3","price":200}}
うん、まぁそうじゃないんだけど、、そうなるよね。となります。

ここで活躍するのが -o オプションです。
-o Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.
というわけで、一致した部分だけを出力してくれます。

$ grep -o apple data1
apple
apple
apple
apple
これでは全然嬉しくないので、周辺を出すために正規表現なんかを取り入れたいです。
それが-Pになるんですが、-Pを使わなくても.*は簡単に使わせてくれます。
$ grep -o apple............................................. data1
apple":{"name":"apple","shop":"shop1","price":100}
apple":{"name":"apple","shop":"shop10","price":110
少し良くなりましたね。簡単な抽出目的ならこれで十分そうです。
でも少しかっこ悪いので、いよいよ-Pを使ってみます。
$ grep -oP '"apple":{(.*?)}' data1
"apple":{"name":"apple","shop":"shop1","price":100}
"apple":{"name":"apple","shop":"shop10","price":110}
完璧です。軽く脳汁出ちゃいますね。快適なgrepライフをお送りください。

前回のawkについての記事はコチラ blog.tech-monex.com