表題の通り。メモである。
■ 環境
- macOS High Sierra
■ grep
普段の使用方法としては、条件に合致もしくは合致しない行全体を表示することが多いのだが、正規表現で合致した文字列のみを抽出したかった。いつも通り合致した行から不要な部分を削除…という手段でいこうかと思ったのだが、`grep`の`man`を見てみるとちゃんとオプションがあるではないか。
-o, --only-matching
Prints only the matching part of the lines.
実際にやってみると下記のようであった。試しにIPとおもわしき文字列を抽出してみる。
テストとして使うファイルは下記。accessログを模したものとする。
192.168.33.10 - - [15/May/2018:19:08:40 +0900] "GET /example/path HTTP/1.1" 404 1514 4795 "192.168.33.11" "-" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8)"
192.168.33.132 - - [15/May/2018:19:08:45 +0900] "GET /example/path2 HTTP/1.1" 302 - "-" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8)"
1行目に2つのIPアドレス、2行目に1つのIPアドレスが存在している。
$ grep -o -E '[0-9]{1,3}(\.[0-9]{1,3}){3}' test.log
192.168.33.10
192.168.33.11
192.168.33.132
$
3つのIPアドレスが取得できた。満足である。
ちなみに正規表現では”[0-9]{1,3}“としてしまっているので、”001“や”999“といったIPアドレスではありえない数値であっても同様のフォーマットであれば取得してしまうが今回はそこまで厳密な用途ではないので良いものとする。
以上。