忍者ブログ

プログラミングの練習

プログラミングの問題やプログラミング関連知識、ソフトウェアのテストについてのブログです

【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