アンドロイド

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

目次:

Anonim

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 という名前のファイルがあるとします。

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行ずつ読み取ることができます。

バッシュターミナル