スポンサーリンク

awkのmatch()関数の使い方

※awkの使い方をまとめて一覧にしました。
参考:awk入門-使い方まとめ一覧-

下記の形式でmatch()を書きます。
対象文字列を先頭から検索し、検索対象が検出された最初の位置を戻り値として返します。

match(対象文字列, 検索対象)
※検索対象は正規表現で指定できる。

スポンサーリンク

match()関数の戻り値

awkのmatch()関数の戻り値は、検索対象が検出された最初の位置を戻り値として返します。
例えば、下記のようにin.txtがあったとします。

 $ cat in.txt 
abc123
abcd123
abcde123123abc123

下記のように、match()関数で"1"が検出された最初の位置をprint出力します。
 $ cat sample.awk 
#!/bin/sh
cat in.txt | awk '		
	{
		num = match($0, "1")
		print $0 "は," num "文字目に1が登場します."
	}
'

下記が実行結果となります。"1"が登場した最初の位置が出力できています。
 $ ./sample.awk 
abc123は,4文字目に1が登場します.
abcd123は,5文字目に1が登場します.
abcde123123abc123は,6文字目に1が登場します.

match()関数の検索対象は正規表現で指定できる

awkのmatch()関数は、正規表現で検索対象を指定できます。
例えば、下記のようにin.txtがあったとします。

 $ cat in.txt 
abc123
321abc
ab789bc123

検索対象には正規表現で、/[1-9]/ と指定し、1~9の数字が検出された最初の位置をprint出力します。
 $ cat sample.awk 
#!/bin/sh
cat in.txt | awk '		
	{
		num = match($0, /[1-9]/)
		print $0 "は," num "文字目に数字が登場します."
	}
'

下記が実行結果となります。1~9の数字が検出された最初の位置をprint出力されているのが確認できます。
 $ ./sample.awk 
abc123は,4文字目に数字が登場します.
321abcは,1文字目に数字が登場します.
ab789bc123は,3文字目に数字が登場します.

match()関数を使うと組み込み変数に値が設定される

awkには、RSTART と RLENGTH の組み込み変数が用意されています。
match()関数を実行すると、
RSTARTには、検索対象が検出された最初の位置が、
RLENGTHには、検索対象が検索された文字列の長さが格納されます。

例えば、下記のようにin.txtがあったとします。

 $ cat in.txt 
abc12345
321abc
ab78912bc123

RSTARTとRLENGTHを下記のようにセットします。
 $ cat sample.awk 
#!/bin/sh
cat in.txt | awk '		
	{
		match($0, /[1-9]+/)
		print $0 "は," RSTART "文字目から" RLENGTH "文字登場します."
	}
'

下記が実行結果です。
 $ ./sample.awk 
abc12345は,4文字目から5文字登場します.
321abcは,1文字目から3文字登場します.
ab78912bc123は,3文字目から5文字登場します.

match()関数とsubstr()関数で文字列を切り出す

awkのmatch()関数で指定した検索対象を、substr()で切り出すこともできます。
先述のRSTARTとRLENGTHの組み込み変数を使います。

例えば、下記のようにin.txtがあったとします。

 $ cat in.txt 
abc12345
321abc
ab78912bc123

substr()にRSTART/RLENGTHを下記のようにセットします。
 $ cat sample.awk 
#!/bin/sh
cat in.txt | awk '		
	{
		match($0, /[1-9]+/)
		num = substr($0, RSTART, RLENGTH)
		print $0 "の数字は," num "です"
	}
'

下記が実行結果になります。
 $ ./sample.awk 
abc12345の数字は,12345です
321abcの数字は,321です
ab78912bc123の数字は,78912です

スポンサーリンク