(O+P)ut

OutPut Log by SE in SIer



(O+P)ut

Output Log by SE

【awk】文字列を検索ワードで前後に切り出す

スポンサーリンク

やりたいこと

文字列があった時に検索ワードを指定して切り出したい。

具体的な例として以下の文字列があった際に

abcdefghijklmn

検索ワード「e」にて

前半部分

abcd

後半部分

fghijklmn

を出力させる。

ワンライナー

検索文字列の前半を切り出す

awk '{print substr($0,0,index($0,"検索文字列"))}'

$ echo abcdefghijklmn |  awk '{print substr($0,0,index($0,"e"))}'
abcd
検索文字列の後半を切り出す

awk '{print substr($0,index($0,"検索文字列")+length("検索文字列")}'

$ echo abcdefghijklmn |  awk '{print substr($0,index($0,"e")+1)}'
fghijklmn


以下、補足です。

補足

awkに実装されているsubstr関数を利用します。

substr(s,i,n) substr(s,i)

Returns the substring of string s, starting at index i, of length n. If n is omitted, the suffix of s, starting at i is returned.

第一引数は文字列、第二引数はスタートする位置、第三引数は文字列の長さです。第三引数は省略可能です。

スタートする位置は3番目で表示させたり

$ echo abcdefghijklmn |  awk '{print substr($0,3)}'
cdefghijklmn

スタートする位置は3番目で長さを5で表示させたりできます

$ echo abcdefghijklmn |  awk '{print substr($0,3,5)}'
cdefg

あとはここに検索文字列を検索するためにindexを利用します。

index(s,t)

If t is a substring of s, then the position where t starts is returned, else 0 is returned. The first character of s is in position 1.

第一引数に文字列、第二引数に検索するワードの位置を返します。

これを使えば"e"で検索をかけてsubstrの第三引数にすれば前半が取り出せそうです。

$ echo abcdefghijklmn |  awk '{print substr($0,1,index($0,"e"))}'
abcde

ただ、今回は「e」部分が不要なので開始位置を「1」ではなく「0」にするトリッキーな手法をとります。

$ echo abcdefghijklmn |  awk '{print substr($0,0,index($0,"e"))}'
abcd

これは検索文字列の長さに依存せず利用できます。

$ echo abcdefghijklmn |  awk '{print substr($0,0,index($0,"ef"))}'
abcd


次は後半部分ですが、こちらはindexで取得した位置を開始位置に利用します。

$ echo abcdefghijklmn |  awk '{print substr($0,index($0,"e"))}'
efghijklmn

今回は「e」部分が不要なので開始位置を1つずらします。

$ echo abcdefghijklmn |  awk '{print substr($0,index($0,"ef")+1)}'
fghijklmn

ただ今回は検索文字列が一文字だったのですが、これが二文字以上であればその分ずらす必要があるので、より汎用的には以下となります。

$ echo abcdefghijklmn |  awk '{print substr($0,index($0,"ef")+length("ef"))}'
ghijklmn

length関数で文字列の長さを取得しています。

終わりに

単純な文字列の抽出によく使う手法なので、備忘録として整理しました。
ご参考になれば幸いです。


他の記事を読む