grep -oオプションの使い方|一致部分のみを抜き出す方法を初心者向けに解説
生徒
「grepコマンドで、検索に一致した部分だけを取り出すことってできますか?」
先生
「できますよ。そのときに使うのが-oオプションです。」
生徒
「なるほど!でも、通常のgrepとの違いがよく分かりません…」
先生
「それでは、-oオプションの使い方や違いを、分かりやすく説明していきましょう。」
1. grep -oオプションとは?
grepコマンドは、ファイルや文字列の中から特定のキーワードを探すLinuxの基本コマンドです。その中でも-oオプションを使うと、検索に一致した「部分」だけを取り出すことができます。
通常のgrepでは、検索キーワードを含む行全体が表示されますが、-oオプションを使うと該当した単語や文字列のみが抜き出されるのです。
2. 基本的なgrep -oの使い方
まず、簡単な例で違いを見てみましょう。次のようなテキストファイルがあるとします。
cat sample.txt
apple orange banana
orange melon apple
この中から「orange」という単語だけを取り出したいとき、-oなしの通常grepではこうなります:
grep orange sample.txt
apple orange banana
orange melon apple
行全体が表示されているのが分かりますね。
ここで-oをつけてみましょう:
grep -o orange sample.txt
orange
orange
検索に一致した「orange」だけが1行ずつ取り出されています!ピンポイントで欲しい情報だけを抜き出すのに便利です。
3. grep -oはどんな場面で使う?
以下のような場面で-oオプションが役立ちます。
- ログファイルから特定のIPアドレスだけを抜き出したいとき
- HTMLソースからURLだけを一覧にしたいとき
- 文章中の特定の単語やパターンを集計したいとき
例:IPアドレスを抜き出す
cat access.log
192.168.1.1 - - [12/Sep/2025] "GET /index.html"
10.0.0.2 - - [12/Sep/2025] "POST /login"
grep -o -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' access.log
192.168.1.1
10.0.0.2
-Eは「拡張正規表現」を使うためのオプションで、IPアドレスのような複雑なパターンも扱えるようになります。
4. grep -oと他のオプションを組み合わせよう
-oオプションは、他のオプションと組み合わせて使うことで、より便利になります。
4-1. -i(大文字・小文字を区別しない)
「Orange」「orange」「ORANGE」など、すべて同じと見なして抽出するには、-iと組み合わせます。
grep -oi orange sample.txt
orange
orange
4-2. -r(ディレクトリを再帰的に検索)
複数ファイルの中から特定の文字列を探したいときは、-r(recursive=再帰的)と組み合わせて使います。
grep -ro 'href' ./html/
./html/index.html:href
./html/about.html:href
-oがあることで「href」だけが結果に表示されています。
5. grep -oとcut・awk・sedとの違い
cutやawk、sedなども文字列を抜き出すコマンドとして使われますが、grep -oはあくまで「パターンにマッチした部分だけを抽出する」ことに特化しています。
cut:文字数や区切り文字で列を切り取るawk:条件処理や列の操作もできる高機能ツールsed:文字列の置換や抽出ができるストリームエディタ
例えば以下のような比較ができます:
echo 'apple orange banana' | grep -o 'orange'
orange
echo 'apple orange banana' | cut -d' ' -f2
orange
cutは位置が決まっている場合に便利ですが、パターンマッチングができないので、柔軟性ではgrep -oに軍配が上がります。
6. grep -oの注意点
ただし、grep -oは検索対象が複数マッチする場合は1つずつ分けて表示されます。そのため、行単位の情報が欲しいときには向いていない場面もあります。
また、改行をまたいだ検索には対応していないため、複数行にまたがる情報抽出には別のツール(例:perlやawk)を使う必要があります。