grep -o オプション/検索にマッチする部分のみを出力【Linuxコマンド】

grep -o オプション/検索にマッチする部分のみを出力【Linuxコマンド】

grep コマンドで、検索にマッチする部分のみを抽出できる  -o オプションについて説明します。

文字列から特定の部分のみ抽出したい場合、sed を使うことが多いですが、コマンドが長かったり、複雑になったり、どのような構文にすれば良いか悩むことが多いです。

ですが、それほど複雑な抽出条件でなければ、grep-o オプションで実現することができます。

grep -o オプション/検索にマッチする部分のみを出力【Linuxコマンド】

コマンドのマニュアルを確認

man grep でオプションの説明を確認してみます。

$ man grep
:
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate output
line.
:

“o” は “only-matching” の略。

上記を日本語訳にすると、「マッチする行のマッチした部分だけを (それが空文字列でなければ) 表示します。 マッチした各文字列は、それぞれ別の行に書き出します。」

-o オプションなしの grep

-o オプションなしの grep は、マッチした行を抽出します。

$ echo "abcdefg0123456789" | grep 123
abcdefg0123456789
$ echo "abcdefg0123456789" | grep abc
abcdefg0123456789

-o オプションありの grep

-o (--only-matching) オプションで、検索にマッチした部分のみを出力します。

$ echo "abcdefg0123456789" | grep -o abc
abc
$ echo "abcdefg0123456789" | grep -o 123
123

正規表現を使うこともできます。

$ echo "abcdefg0123456789" | grep -o [0-9]
0
1
2
3
4
5
6
7
8
9
$ echo "abcdefg0123456789" | grep -o [a-z]
a
b
c
d
e
f
g

grep -o の使用例(Apacheのサンプルログで説明)

以下のApacheのサンプルログで、grep -o の活用例を説明します。

$ cat sample.log
48.180.182.71 - - [31/Jan/2021:15:31:26 +0000] "GET /category/software HTTP/1.1" 200 90 "/category/finance" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"
216.60.169.137 - - [31/Jan/2021:15:31:26 +0000] "GET /item/books/1744 HTTP/1.1" 200 113 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"
208.189.120.74 - - [31/Jan/2021:15:31:26 +0000] "GET /item/books/1430 HTTP/1.1" 200 98 "/category/books" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"
176.117.103.46 - - [31/Jan/2021:15:31:26 +0000] "GET /item/office/3059 HTTP/1.1" 200 139 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
56.207.119.182 - - [31/Jan/2021:15:31:26 +0000] "GET /category/games HTTP/1.1" 200 102 "-" "Mozilla/5.0 (Windows NT 6.0; rv:10.0.1) Gecko/20100101 Firefox/10.0.1"
128.138.60.202 - - [31/Jan/2021:15:31:26 +0000] "GET /category/books HTTP/1.1" 200 114 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
192.177.22.139 - - [31/Jan/2021:15:31:27 +0000] "GET /category/software HTTP/1.1" 200 115 "-" "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
92.225.163.127 - - [31/Jan/2021:15:31:27 +0000] "POST /search/?c=Electronics HTTP/1.1" 200 99 "/category/office" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1""

ログからアクセス元のIPアドレスを全て抽出するには、以下のようなコマンドを実行します。

$ cat sample.log | grep -o ^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*
48.180.182.71
216.60.169.137
208.189.120.74
176.117.103.46
56.207.119.182
128.138.60.202
192.177.22.139
92.225.163.127

以上、grep-o オプションの説明と使用例でした。