理系学生日記

おまえはいつまで学生気分なのか

grep に --only-matching オプションとかあって驚愕している

タイトルのとおりで、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