GNU/Linux >> Linux の 問題 >  >> Linux

Bashでファイルを1行ずつ読み取る方法

Bashスクリプトを作成するとき、ファイルを1行ずつ読み取る必要がある状況に遭遇することがあります。たとえば、スクリプトで処理する必要のあるデータを含むテキストファイルがあるとします。

このチュートリアルでは、Bashでファイルを1行ずつ読み取る方法について説明します。

ファイルを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」などの値が含まれている場合、エコーオプションとして扱われます。

ファイルを1行ずつ読み取る例#

次の例を見てみましょう。 distros.txtという名前のファイルがあるとします。 最も人気のあるLinuxディストリビューションのいくつかのリストと、それらのパッケージマネージャーがコンマ(,で区切られています)が含まれています ):

distros.txt
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行ずつ読み取ることができます。 コマンド。

ご質問やご意見がございましたら、お気軽にコメントをお寄せください。


Linux
  1. Bashスクリプトで1行ずつ読む

  2. VIM:Ubuntu で正確な行に移動する方法

  3. Bashを使用してファイルの最後から2番目の行を読み取る方法は?

  1. Busy Boxはファイルを1行ずつ読み取りますか?

  2. ファイルから変数を読み取る方法は?

  3. bash シェルでファイルのセクションを grep する方法

  1. Bash で、ファイルの各行の後に文字列を追加するにはどうすればよいですか?

  2. BashでCSVファイルを解析するには?

  3. Linux の Bash で syslog を確認するには?