grep で正規表現にマッチした部分だけ抽出するには? [NT]
grep で正規表現にマッチした部分だけを抽出(抜き出す)には、-o オプションを用いる。
ただし、-o オプションは比較的新しい grep でないと使用できない。 GNU utilities for Win32 で紹介したパッケージに含まれる grep のバージョンは、
> grep -V
GNU grep version 2.0 + multi-byte extension 1.04
であり、このバージョンでは使えない。そこで、Grep for Windows からダウンロードできるバージョンを使うと良い。こちらは 2.5.4 である。
>grep -V
GNU grep 2.5.4
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
ダウンロード出来るファイルは幾つかあるが、めんどくさい方は Setup を使う。zip が欲しい方は Binaries と Dependencies の Zip をダウンロードして、 Dependencies に含まれる dll を Binaries の grep と同じディレクトリに入れればよい。
-o オプションは例えば、
Active Connections
Proto Local Address Foreign Address State
TCP 127.0.0.1:4111 127.0.0.1:4112 ESTABLISHED
TCP 127.0.0.1:4112 127.0.0.1:4111 ESTABLISHED
TCP 127.0.0.1:4114 127.0.0.1:4115 ESTABLISHED
TCP 127.0.0.1:4115 127.0.0.1:4114 ESTABLISHED
TCP 127.0.0.1:5152 0.0.0.0:0 LISTENING
TCP 127.0.0.1:5152 127.0.0.1:4113 CLOSE_WAIT
TCP 127.0.0.1:9089 0.0.0.0:0 LISTENING
TCP 127.0.0.1:10110 0.0.0.0:0 LISTENING
という内容の ip.txt のデータがあるとして、これから IP アドレスとポートの部分を抜き出すには、
grep -o -e [0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+:[0-9]\+ ip.txt
とすると、
127.0.0.1:4111
127.0.0.1:4112
127.0.0.1:4112
127.0.0.1:4111
127.0.0.1:4114
127.0.0.1:4115
127.0.0.1:4115
127.0.0.1:4114
127.0.0.1:5152
0.0.0.0:0
127.0.0.1:5152
127.0.0.1:4113
127.0.0.1:9089
0.0.0.0:0
127.0.0.1:10110
0.0.0.0:0
を得られる。
参考文献
- #085 正規表現の落とし穴
- 正規表現の基礎
- 【 どのような正規表現があるのか 】 - Linuxコマンド逆引き大全:ITpro
- grepの正規表現 - satospo
- 単語抽出するちょっとしたテクニック - 技術メモ帳
- www.okubo.tk/blog: grep -o
- grep で欲しい部分のみ出力 - 波間の浮遊物