awkで正規表現を使って文字列を抽出する
シェルしか使えない環境で正規表現を使いたい、なんてときは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
- 肌寒い
最近の記事を読む
- Flutterでcontextを使わずにlocale情報を取得する
- Cloud RunでIAPを有効にしようとしてハマったこと
- slimでtype='application/ld+json'のscriptタグを書く
- タグマネージャーでjsのloadイベントを発火させたいとき
- mysqlコマンドを実行してERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)と言われたら