Bash/シェルスクリプトで文字列を分割する方法|cutコマンドの実例付きで解説
この記事では、Bash/シェルスクリプトにおいて、指定した区切り文字で文字列を分割する方法を、具体的な例とともに解説します。
文字列の分割は、スクリプトを作成する際に非常に便利な機能です。CSV(カンマ区切り値)は、オンラインでデータが提供される際によく使われる形式で、表内の各データフィールドがカンマで区切られています。
また、文章をスペースで単語ごとに分割したり、段落をピリオドで文ごとに分割したりといった用途にも活用できます。
多くの解説ではBash固有の文字列分割手法に焦点が当てられがちですが、ここではどのLinuxシェルスクリプトでも動作する汎用的な方法を紹介します。
cutコマンドを使って文字列を分割する
Linuxのcutコマンドは、テキストファイルの各行から指定した部分を切り出して出力するコマンドです。
この例では、このコマンドを応用して、指定した区切り文字でテキストを分割します。
cutコマンドの詳細な仕様については、公式マニュアル(manページ)をご参照ください。
サンプルコード
以下は、文字列splitMeを受け取り、カンマ(,)で区切った位置に基づいて要素を返すBashスクリプトの例です。
#!/bin/bash # カンマ区切りの文字列を定義 splitMe='apple,banana,grape,kiwi' # 分割した文字列の1番目の要素を取得 firstItem="$(echo $splitMe | cut -d',' -f1)" # 分割した文字列の3番目の要素を取得 thirdItem="$(echo $splitMe | cut -d',' -f3)" # 結果を画面に出力して確認 echo $thirdItem
なぜこれが動作するのでしょうか?echoコマンドで元の文字列をパイプ経由でcutコマンドに渡しています。cutコマンドは、-dオプションで区切り文字を指定し(この例ではカンマですが、任意の1文字や文字列を使用できます)、-fオプションに続けて数値を指定することで、返すフィールド(分割後の文字列から取得したい要素の位置)を決めます。上記のスクリプトを実行すると、「kiwi」が出力されます。
再利用可能なBash関数
上記の方法でも十分動作しますが、毎回コマンドを書くのは非効率です。そこで、引数を渡すだけで使える関数としてまとめたものがこちらです。
#!/bin/bash
# 文字列を分割する関数を定義
# 3つの引数を受け取る:分割対象の文字列、区切り文字、返す要素の位置
splitMyString(){
splitString=$1
delimiter=$2
item=$3
result="$(echo $splitString | cut -d"$delimiter" -f$item)"
echo $result
}
# テスト用の文字列を定義
splitMe='apple,banana,grape,kiwi'
# 関数をテスト:カンマで文字列を分割し、2番目の要素を返す
echo $(splitMyString $splitMe "," 2)
この関数では、第1引数に分割したい文字列、第2引数に区切り文字、第3引数に取得したい要素の位置を渡します。実行すると「banana」が出力され、区切り文字も自由に変更できるため、CSV以外のデータ処理にもそのまま流用できます。
-
Bashシェル関数入門:実用的な6つのサンプル例で学ぶチュートリアル
Bashシェル関数とは、複数のUNIX/Linuxコマンドをひとつの名前でグループ化し、後からまとめて実行できるようにする仕組みです。Bashシェル関数は通常のUnixコマンドと同じように呼び出すことができ、現在のシェルコンテキスト内で実行されるため、解釈用の新しいプロセスを生成する必要がありません。bashのエイリアス(alias)と関数はどちらも、長いコマンドや複雑なコマンドに対するショートカットを定義するのに役立ちます。しかし、エイリアスでは制御フローや引数の扱いなど、関数ならではの高度な処理を行うことはできません。本記事では、その違いも含めて詳しく解説していきます。この記事は、進行中の
-
実用的な5つの例で学ぶBashスクリプト入門チュートリアル
Unix SedやUnix Awkシリーズと同様に、本シリーズではBashスクリプティングに関する記事を複数回にわたって公開します。実用的なサンプルを交えながら、Bashスクリプティングのテクニックを幅広く解説していきます。 シェルとは、ユーザーが入力したコマンドを解釈して実行するプログラムです。コマンドはユーザーが直接入力するか、「シェルスクリプト」と呼ばれるファイルから読み込まれます。 ユーザーからの入力を直接読み取る場合、そのシェルは対話型(インタラクティブ)シェルと呼ばれます。 一方、ファイルからコマンドを読み込んで実行する場合は非対話型(ノンインタラクティブ)シェルと呼ばれます。この