Bashスクリプトを作成するとき、ファイルを1行ずつ読み取る必要がある状況に遭遇することがあります。たとえば、スクリプトで処理する必要のあるデータを含むテキストファイルがあるとします。
このチュートリアルでは、Bashでファイルを1行ずつ読み取る方法について説明します。
ファイルを1行ずつ読み取るための最も一般的な構文は次のとおりです。
while IFS= read -r line; do
printf '%s\n' "$line"
done < input_file
または同等の単一行バージョン:
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
どのように機能しますか?
入力ファイル(input_file
)は、whileループにリダイレクトされるファイルの名前です。 read
コマンドはファイルを1行ずつ処理し、各行をline
に割り当てます。 変数。すべての行が処理されると、whileループは終了します。
デフォルトでは、read
コマンドはバックスラッシュをエスケープ文字として解釈し、先頭と末尾の空白をすべて削除します。これにより、予期しない動作が発生する場合があります。バックスラッシュのエスケープを無効にするために、-r
を使用してコマンドを呼び出しています。 オプション、およびトリミングを無効にするには、内部フィールドセパレーター(IFS
)がクリアされます。
[printf
を使用しています ] echo
の代わりに コードの移植性を高め、望ましくない動作を回避するため。たとえば、行に「-e」などの値が含まれている場合、エコーオプションとして扱われます。
次の例を見てみましょう。 distros.txt
という名前のファイルがあるとします。 最も人気のあるLinuxディストリビューションのいくつかのリストと、それらのパッケージマネージャーがコンマ(,
で区切られています)が含まれています ):
Ubuntu,apt
Debian,apt
CentOS,yum
Arch Linux,pacman
Fedora,dnf
ファイルを1行ずつ読み取るには、ターミナルで次のコードを実行します。
while IFS= read -r line; do
printf '%s\n' "$line"
done < distros.txt
コードはファイルを1行ずつ読み取り、各行を変数に割り当てて出力します。基本的に、cat
を使用してファイルの内容を表示する場合と同じ出力が表示されます。 コマンド。
aptを使用するディストリビューションのみを印刷したい場合はどうなりますか? 1つの方法は、if
を使用することです。 ステートメントを作成し、行にaptサブストリングが含まれているかどうかを確認します:
while IFS= read -r line; do
if [[ "$line" == *"apt"* ]]; then
printf '%s\n' "$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
printf '%s is the package manager for %s\n' "$pm" "$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
printf '%s\n' "$line"
done < <(cat input_file )
Here文字列の使用#
ヒア文字列はヒアドキュメントの変形です。文字列(cat input_file )
改行を保持します:
while IFS= read -r line; do
printf '%s\n' "$line"
done <<< $(cat input_file )
ファイル記述子を使用してループに入力を提供することもできます:
while IFS= read -r -u9 line; do
printf '%s\n' "$line"
done 9< input_file
ファイル記述子を操作するときは、シェルの内部ファイル記述子との競合を避けるために、4〜9の数字を使用してください。
結論#
Bashでは、whileループとread
を使用して、ファイルを1行ずつ読み取ることができます。 コマンド。
ご質問やご意見がございましたら、お気軽にコメントをお寄せください。