awkのmatch()関数の使い方
下記の形式で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です