シェルしか使えない環境で正規表現を使いたい、なんてときはawkが便利。

受け取ったテキストの中から特定の文字列を抽出したい、みたいなときはこんな風に書いてみるとよさそう。

gawk 'match($0, /public_html\/([a-zA-Z0-9_\-]*)\//, a) {print a[1]}'

前半のmatch($0, /public_html\/([a-zA-Z0-9_\-]*)\//, a)が正規表現で抽出を書けている部分。 $0に入力したテキスト情報が入っていて、/public_html\/([a-zA-Z0-9_\-]*)\//が正規表現。

([a-zA-Z0-9_\-]*)が今回抽出したい文字列ということになる。

この抽出したい文字列は3番目の引数に設定するaという変数で受け取る感じ。

そして、その抽出結果を使って何をするか、というのが後半の{print a[1]}になる。

ここでは抽出した結果を単純に標準出力として吐き出しているだけ。

a[0]には正規表現にマッチした全体のテキストが入っている。public_html/abc/とか。

a[1]にはキャプチャグループの内容が入ってくる。今回はこれがほしい。

たとえば以下のような入力があったとして、”aaa”とか”bbb”みたいなサブディレクトリの文字列を抜き出したいなんてときは上記の正規表現を実行すればOK

public_html/abc/sample.html
public_html/123/sample.html
public_html/def/sample.html

test.txtに上記のテキストを記録したとして実行するとこんな感じで抽出可能です。

あとは、そこからさらにshellのコマンドをいろいろつなぎ込んでいろいろな仕事をしていく感じですね。

$ gawk 'match($0, /public_html\/([a-zA-Z0-9_\-]*)\//, a) {print a[1]}' < test.txt
abc
123
def

この記事の環境情報

  • GNU Awk 5.2.0
  • 肌寒い