タイトルのとおりで、grep に --only-matching (-o)オプションあって驚愕した結果として心がぴょんぴょんした。 とりあえず手元にある Mac の grep だと
$ grep --version grep (BSD grep) 2.5.1-FreeBSD
になってるけど、--only-matching
オプション存在してる。
で、この --only-matching
オプションについてです
grep、よく知られているように引数で指定した文字列がある入力行を標準出力に出してくれるっていうのが基本動作になってる。けど、--only-matching (-o) オプションつけると、引数で指定した文字列にマッチする部分だけ抽出する。
$ cat > a.txt abcdefg hijklmn opqrstu vwxyz # 「s」が存在する行を抽出する $ grep s a.txt opqrstu # 「s」と任意の 1 文字からなる部分を抽出する $ grep -o s. a.txt st
これ何が良さげかっていうと、grep には正規表現を指定することができることを加味して考えると、結局、正規表現でキャプチャができる。特に拡張正規表現(ref: man re_format
)が使える egrep なんかの使用まで想定すると、かなりベンリなかんじある。次のヤツ、かなり作為的なかんじにしてるけど、文字列の中から有効な IP アドレスだけ抽出するみたいなかんじのことができる。
$ cat > b.txt This is valid ip address: 192.168.1.1 and 256.1.1.4 is not valid address $ egrep -o '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b' b.txt 192.168.1.1