正規表現でマッチしたグループを複数抽出する

Page content

概要

正規表現でマッチしたグループを複数抽出する場合はsedを使うと良い.グループが1つの場合はgrepでも-oP\Kで抽出できるが,グループが複数あるとできない.

コード

i番目のグループ(()で囲まれた部分)を\iで置換する.

sed -r 's/<正規表現>/\i/g

vncのポート番号とpidを抽出する例

sed

$ ss -ltp | grep vnc 
LISTEN    0         5                  0.0.0.0:5901             0.0.0.0:*        users:(("Xtigervnc",pid=3193,fd=7))                                            
LISTEN    0         5                  0.0.0.0:5902             0.0.0.0:*        users:(("Xtigervnc",pid=4404,fd=7))                                            
LISTEN    0         5                  0.0.0.0:5903             0.0.0.0:*        users:(("Xtigervnc",pid=4453,fd=7))                                            
LISTEN    0         5                     [::]:5901                [::]:*        users:(("Xtigervnc",pid=3193,fd=8))                                            
LISTEN    0         5                     [::]:5902                [::]:*        users:(("Xtigervnc",pid=4404,fd=8))                                            
LISTEN    0         5                     [::]:5903                [::]:*        users:(("Xtigervnc",pid=4453,fd=8))
$ ss -ltp | grep vnc | sed -r 's/^.*:([0-9]+).*pid=([0-9]+).*$/\1 \2/' | sort -u
5901 3193
5902 4404
5903 4453

うまくいく.

grep

$ ss -ltp | grep vnc | grep -oP ':\K(\d+).*pid=\K(\d+)' | sort -u
3193
4404
4453

最後にマッチした部分のみが抽出されてしまう.

参考