目次:
Bashスクリプトを作成するとき、ファイルを1行ずつ読み取る必要がある場合があります。 たとえば、スクリプトで処理する必要があるデータを含むテキストファイルがあるとします。
このチュートリアルでは、Bashで1行ずつファイルを読み取る方法について説明します。
行ごとのファイルの読み取り構文
ファイルを1行ずつ読み取るための最も一般的な構文は次のとおりです。
while IFS= read -r line do echo "$line" done < input_file
または同等の単一行バージョン:
while IFS= read -r line; do echo $line; done < input_file
どのように機能しますか?
入力ファイル(
input_file
)は、
read
コマンドによる
read
用に開くファイルの名前です。
read
コマンドは、ファイルを1行ずつ読み取り、各行を
line
変数に割り当てます。 すべての行が処理されると、whileループが終了します。 内部フィールド区切り記号(
IFS
)は、
read
コマンドのデフォルトの動作である先頭および末尾の空白を保持するためにヌル文字列に設定されます。
行ごとにファイルを読む例
次の例を見てみましょう。 最も人気のあるLinuxディストリビューションとそのパッケージマネージャーのリストがコンマ(
,
)で区切られた
distros.txt
という名前のファイルがあるとします。
Ubuntu, apt Debian, apt CentOS, yum Arch Linux, pacman Fedora, dnf
ファイルを1行ずつ読み取るには、ターミナルで次のコードを実行します。
while IFS= read -r line do echo "$line" done < distros.txt
コードはファイルを1行ずつ読み取り、各行を変数に割り当て、変数をエコーします。 基本的に、catコマンドを使用してファイルの内容を表示する場合と同じ出力が表示されます。
aptを使用するディストリビューションのみを印刷する場合はどうなりますか? 1つの方法は、ifステートメントを使用して、行にaptサブストリングが含まれているかどうかを確認することです。
while IFS= read -r line do if]; then echo "$line" fi done < distros.txt
Ubuntu, apt Debian, apt
ファイルを1行ずつ読み込む場合、複数の変数をreadコマンドに渡して、
IFS
基づいて行をフィールドに分割することもできます。 最初のフィールドは最初の変数に、2番目は2番目の変数に、というように割り当てられます。 変数よりもフィールドが多い場合、残りのフィールドは最後の変数に割り当てられます。
次の例では、IFSをコンマ(
,
)に設定し、2つの変数
distro
と
pm
をreadコマンドに渡します。 行の先頭から最初のコンマが最初の変数(
distro
)に割り当てられ、行の残りが2番目の変数(
pm
)に割り当てられるまでのすべて:
while IFS=, read -r distro pm do echo "$pm" is the package manager for "$distro" done < distros.txt
apt is the package manager for Ubuntu apt is the package manager for Debian yum is the package manager for CentOS pacman is the package manager for Arch Linux dnf is the package manager for Fedora
代替ファイル読み取り方法
プロセス置換の使用
プロセス置換により、コマンドからの出力をファイル名として渡すことができます。
while IFS= read -r line do echo "$line" done < <(cat input_file)
ヒア文字列の使用
Here Stringは、Hereドキュメントのバリアントです。 文字列
(cat input_file)
は改行を保持します:
while IFS= read -r line do echo "$line" done <<< $(cat input_file)
ファイル記述子を使用する
ファイル記述子を使用してループに入力を提供することもできます。
while IFS= read -r -u9 line do echo "$line" done 9< input_file
ファイル記述子を使用するときは、シェル内部ファイル記述子との競合を避けるために4〜9の数字を使用します。
結論
Bashでは、while読み取りループへの入力としてファイル名を提供することにより、ファイルを1行ずつ読み取ることができます。
バッシュターミナル