■ はじめに
なんだかんだで、シェルスクリプト(Bsh)を扱う機会があって その中で文字列抽出をちょこちょこのだが、すぐに忘れてしまう、、、 で、ブログにまとめておいたつもりだったが、 全然まとまっていなかったので、今回で整理する。 また、cut / revコマンドを学んだので、ついでにメモっておく。
目次
【0】実行環境 【1】cut / rev コマンドで抽出する 例1:ファイル名から特定の文字列を抽出する 例2:JDBC URLからHost/Portを抽出する 【2】sedコマンドで抽出する 【3】awkコマンドで抽出する 例1:カンマ区切りの文字列を抽出する 【4】bashによる文字列置換
【0】実行環境
* 気軽に動作確認するなら、以下のサイトが便利。
https://paiza.io/projects/QzTJKlZTT6VvvqVUGNvT4A?language=bash
【1】cut / rev コマンドで抽出する
* 文字列が固定されている場合に有効。
a) cutコマンド
* 文字列を切り出す
オプション | 説明 | サンプル |
---|---|---|
-c <数字> | 切り出す位置の指定する | 例1参照 |
-d <区切り文字> | 区切り文字の指定(d:delimiter)。-fを組み合わせる | 例2参照 |
-f <区切り文字> | 項目数の指定(f:fields)。-dを組み合わせる | 例2参照 |
https://eng-entrance.com/linux-command-cut
b) revコマンド
* 文字列を逆順にする(e.g. "World" => "dlroW")
例1:ファイル名から特定の文字列を抽出する
# ファイル名。ここから「sample_table」を抽出する input_data="0000_sample_table_xxxx.sql" echo "0) input_data = ${input_data}" data1=`echo ${input_data} | cut -c 6-` echo "1) data1 = ${data1}" data2=`echo ${data1} | rev | cut -c 10- | rev` echo "2) data2 = ${data2}"
出力結果
0) input_data = 0000_sample_table_xxxx.sql 1) data1 = sample_table_xxxx.sql 2) data2 = sample_table
例2:JDBC URLからHost/Portを抽出する
jdbc_url="jdbc:postgresql://localhost:5432/sample_db" host_n_port=`echo ${jdbc_url} | cut -d '/' -f 3` host=`echo ${host_n_port} | cut -d ':' -f 1` port=`echo ${host_n_port} | cut -d ':' -f 2` echo "host_n_port=${host_n_port}" echo "host=${host}" echo "port=${port}"
出力結果
host_n_port=localhost:5432 host=localhost port=5432
参考文献
https://shuzo-kino.hateblo.jp/entry/2015/04/12/153737
【2】sedコマンドで抽出する
* sed (セド) は、文字列の置換/削除するコマンド => 不要な部分を削除してしまえば、抽出することができる * 詳細は、以下の関連記事を参照のこと。
sedコマンド
https://dk521123.hatenablog.com/entry/2019/11/23/101625
例1:ファイル名からデータの一部を抽出する
https://www.atmarkit.co.jp/ait/articles/1610/18/news008.html
# 「(~)」により、文字列の一部を取り出せる echo "systemname_table1.sql" | sed -r 's/systemname_(.*).sql$/\1/'
出力結果
table1
例2:取り出した値を変数に格納する
https://myokoym.hatenadiary.org/entry/20110408/1302292907
#!/bin/bash # 'person'を取りたい。100は可変。 result=`echo "100_table_name_person.sql" | sed -r "s/^.*_table_name_(.*).sql$/\1/"` echo "Result : ${result}"
出力結果
Result : person
【3】awkコマンドで抽出する
* awk (オーク) は、区切り文字のテキストを処理するコマンド * 詳細は、以下の関連記事を参照のこと。
https://dk521123.hatenablog.com/entry/2019/11/22/223043
例1:カンマ区切りの文字列を抽出する
# [構文] awk -F'[区切り文字]' 'パターン {アクション}' result=`echo "1,2,4,8" | awk -F',' '{print $3}'` # Result is 4 ($3 で3番目の要素を出力した) echo "Result is ${result}"
【4】bashによる文字列置換
* 詳細は、以下の関連記事を参照のこと。
https://dk521123.hatenablog.com/entry/2020/03/24/223323
参考文献
https://myokoym.hatenadiary.org/entry/20110408/1302292907
関連記事
シェル ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2014/10/23/005406
JDBC を シェルスクリプトでパースする ~ bashによる文字列置換 ~
https://dk521123.hatenablog.com/entry/2020/03/24/223323
sedコマンド
https://dk521123.hatenablog.com/entry/2019/11/23/101625
awkコマンド
https://dk521123.hatenablog.com/entry/2019/11/22/223043