ちょっとしたスクリプトを作っていた際、文字列の抜き出しを多様する処理があったので忘れないように残しておく。

2017/01/14 追記
個人的な好みで、変数へ代入をしてこなかった(スクリプト書かずにシェル芸で対応することのほうが多いため)のだが、スクリプトで書くなら変数に代入してからパラメータ展開によって文字列を抜き出す方法もあるので、念のため追記しておく。

左から◯文字

cut -c [開始文字(個数)]-[終了文字(個数)]
[root@test-node ~]# # 例:左から1文字目~4文字目
[root@test-node ~]# echo abcdefghijk | cut -c 1-4
abcd
[root@test-node ~]#
[root@test-node ~]# # 例:左から2文字目~5文字目
[root@test-node ~]# echo abcdefghijk | cut -c 2-5
bcde

パラメータ展開を利用して抽出する場合は、変数展開時に以下のように指定する。

${変数::N}
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1::5}
12345
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2::6}
ABCDEF

左から◯文字を除外する

cut -c [開始文字(個数)+1]-
[root@test-node ~]# # 例:左から3文字を除外
[root@test-node ~]# echo abcdefghijk | cut -c 4-
defghijk

パラメータ展開を利用して抽出する場合は、変数展開時に以下のように指定する。

${変数:N}
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1:3}
4567890
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2:9}
VDEFG

右から◯文字

rev | cut -c [開始文字(個数)]-[終了文字(個数)] | rev
[root@test-node ~]# # 例:右から1文字目~5文字目
[root@test-node ~]# echo abcdefghijk | rev | cut -c 1-5 | rev
ghijk
[root@test-node ~]# echo abcdefghijk | rev | cut -c 3-6 | rev
fghi

パラメータ展開を利用して抽出する場合は、変数展開時に以下のように指定する。

${変数::N}
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1::5}
12345
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2::6}
ABCDEF

右から◯文字を除外する

rev | cut -c [開始文字(個数)+1]- | rev
[root@test-node ~]# # 例:右から4文字を除外
[root@test-node ~]# echo abcdefghijk | rev | cut -c 5- | rev
abcdefg

パラメータ展開を利用して抽出する場合は、変数展開時に以下のように指定する。

${変数::-N}
[root@BS-PUB-CENT7-01 ~]# echo $TEST1
1234567890
[root@BS-PUB-CENT7-01 ~]# echo ${TEST1::-5}
12345
[root@BS-PUB-CENT7-01 ~]# echo $TEST2
ABCDEFGABVDEFG
[root@BS-PUB-CENT7-01 ~]# echo ${TEST2::-9}
ABCDE

文字A\~文字Bまでを抽出する

awk '{print substr($0, index($0, "b"), index($0, "e") -1 )}'
[root@test-node ~]# # bからgまでを抽出
[root@test-node ~]# echo abcdefghijk | awk '{print substr($0, index($0, "b"), index($0, "g") -1 )}'
bcdefg
[root@test-node ~]# # bからeまでを抽出(1回のみ)
[root@test-node ~]# echo abcdefabcdef | awk '{print substr($0, index($0, "b"), index($0, "e") -1 )}'
bcde

文字A\~文字Bまでを除外する

awk '{sub("文字A.*.文字B", "");print $0;}'
[root@test-node ~]# # 「_」から「_」までを除外して表示する
[root@test-node ~]# echo aaa_bbbb_cccc | awk '{sub("_.*._", "");print $0;}'
aaacccc

指定した文字以降を抽出する

awk '{print substr($0, index($0, "文字"))}'
[root@test-node ~]# # b以降を出力させる
[root@test-node ~]# echo aaa_bbbb_cccc | awk '{print substr($0, index($0, "b"))}'
bbbb_cccc

パラメータ展開を利用して抽出する場合は、変数展開時に以下のように指定する。

${変数##文字列} # 左から最長一致
${変数#文字列} # 左から最短一致

指定した文字以降を除外する

awk '{sub("文字A.*", "");print $0;}'
[root@test-node ~]# # b以降を除外する
[root@test-node ~]# echo aaa_bbbb_cccc | awk '{sub("b.*", "");print $0;}'
aaa_

パラメータ展開を利用して抽出する場合は、変数展開時に以下のように指定する。

${変数%%文字列} # 右から最長一致
${変数%文字列} # 右から最短一致