【Bash入門】ファイルを1行ずつ読み込む基本パターン|while read line とリダイレクトの使い方
Bashスクリプトでテキストファイルやログファイルを一行ずつ読み込んで処理したい場合、while read ループ とリダイレクト(<)を組み合わせるのが最も一般的かつ効果的な手法です。
今回はその基本構造と実行例について解説します。
1. サンプルコードと実行例
対象ファイルの内容を1行ずつ変数へ格納し、ループ内で出力するスクリプトです。
① ソースコード(read_file.sh)
#!/bin/bash
while read line
do
echo $line
done < sample.txt
② 読み込み対象ファイル(sample.txt)
abc
123
456
③ 実行結果
$ ./read_file.sh
abc
123
456
2. while read line の仕組みとポイント
処理の流れと構文の重要なポイントをまとめます。
Point:入力リダイレクトによる効率的な読み込み
・while read line:標準入力から1行取得して変数lineにセットし、ファイルの終端(EOF)に達するまでループ処理を継続します。
・末尾のリダイレクト< sample.txt:doneの後ろに< ファイル名を指定することで、ループ体全体の標準入力をファイルに変更します。
・ファイルを一括でメモリに読み込まず1行ずつ処理するため、大容量のログファイルでもメモリを圧迫せずに安全に処理できるのが強みです。
【解説と補足ポイント:実務で必須のハマりポイント対策(
IFS= IFS= read -r)】■ 実務でよく使われる安全な定型文
IFS= read -r line基本文法(
read line)の場合、行頭・行末の半角スペースやタブが自動で削られたり、バックスラッシュ(\)が特殊文字として解釈される挙動が発生します。原文を保持して読み込みたい実務では、以下のように書くのが標準的です。
while IFS= read -r line
do
echo "$line"
done < sample.txt
IFS=:フィールド区切り文字を空に設定し、前後の空白削除を防止。・
-r:バックスラッシュのエスケープ処理を無効化し、そのままの文字列として取得。3. まとめ
Bashでファイルを1行ずつ処理する基本は、while read line ... done < ファイル名 の構成です。
空白やバックスラッシュを含むデータを扱う際は、IFS= read -r line を使用するテクニックもあわせて押さえておきましょう。
PR