ウェブサイト検索

高度なBashファイル操作


ファイルは、システム内にコンテンツを永続的に保存し、後で使用できるようにするために使用されます。Bashには、他の標準プログラミング言語のようなopen()関数がなく、ファイルを作成、アクセス、または変更することができません。しかし、BashのコマンドやBashスクリプトを使用して、ファイルを作成またはアクセスする方法は複数あります。Bashには、ファイルの詳細を取得し、正規表現パターンを使用してファイルの内容を検索・置換し、ファイルを削除するための多くのコマンドが存在します。このチュートリアルでは、Bashにおけるさまざまな高度なファイル操作が示されています。

目次:

  1. 新しいファイルを作成する
  2. ファイルの存在を確認する
  3. 「for」ループを使用してファイルを読む
  4. 「While」ループを使用してファイルを読む
  5. ファイルのサイズを計算する
  6. ファイルに内容を追加する
  7. ファイルのコピーを作成する
  8. ファイルの場所を移動する
  9. ファイルの総行数をカウントする
  10. ファイル内のコンテンツを検索する
  11. 正規表現を使用してファイルの内容を検索して置換する
  12. ファイルを削除する

新しいファイルを作成する

Bashでは、新しいファイルを作成するための複数の方法があります。新しいファイルは、さまざまな種類のテキストおよびGUIエディタを使用してターミナルから作成できます。このチュートリアルの部分では、Bashの「cat」と「echo」コマンドを使用してターミナルから新しいファイルを作成する方法が示されています。その後、nanoエディタを使用してファイルを作成する方法が示されます。

次のコマンドを実行して「courses.txt」という名前のテキストファイルを作成します:

cat > courses.txt

次の内容をターミナルに入力してください:

Code Name

CSE-106 Object-oriented programming

CSE-208 Visual programming

CSE-303 Advanced DBMS

CSE-407 Unix programming

「Ctrl+d」を押して書き込みを停止し、コマンドプロンプトに移動します。

次に、ファイルの内容を確認するために以下のコマンドを実行します:

cat courses.txt

次のコマンドを実行して、単純なテキストのファイルを作成します。

echo "It is a testing file." > test.txt

次に、「cat」コマンドを実行して「text.txt」ファイルの内容を確認してください。

前のコマンドを実行した後、次の出力が表示されます:

次のコマンドを実行して、テキストファイル「course-teacher.txt」を作成するためにnanoエディタを開いてください:

nano course-teacher.txt

次の内容をエディターに入力してください:

Code Teacher

CSE-208 Saima Akter

CSE-303 Mahmuda Ferdous

CSE-407 Sabrina Sultana

エディタから保存して終了するには「Ctrl+x」を押してください。

次のコマンドを実行してファイルの内容を確認してください:

cat course-teacher.txt

ファイルの存在を確認する

「-f」オプションは通常のファイルの存在を確認するために使用され、「-s」オプションは空でないファイルの存在を確認するために使用されます。ファイルが存在しデータが含まれている場合、ファイルが存在しデータが含まれていることを知らせるメッセージが表示されます。そうでない場合は、ファイルが空であるか存在しないことを知らせるメッセージが表示されます。

#!/bin/bash

read -p "Enter an existing filename: " fn

#Check whether the file exists with data or not

if [ -f "$fn" ]

then

if [ -s "$fn" ]

then

#Print a message if the file is not empty

echo "$fn file exists and contains data."

else

#Print a message if the file is empty

echo "$fn file is empty."

fi

else

#Print a message if the file does not exist

echo "$fn file does not exist."

fi

「courses.txt」ファイルは、データを含むために以前に作成されています。そのため、スクリプトが「courses.txt」ファイル名で実行されると、以下の出力が表示されます:

以下の出力によれば、「t.txt」ファイルは存在しており、ファイルは空です:

以下の出力によれば、「course.txt」ファイルは現在の場所に存在しません:

「For」ループを使用してファイルを読み込む

既存のファイルは、Bashの異なるループを使って読み取ることができます。以下のスクリプトは、コマンドライン引数として渡されたファイル名を使用してファイルの内容を読み取るための「for」ループの使用例を示しています。スクリプト内では、IFS変数がファイルの改行を検出するために使用されています。「cat」コマンドは、「for」ループの中でファイルの内容を行単位で読み取るために使用されます。「$counter」変数は、ファイルの各行に行番号を印刷するために使われます。

#!/bin/bash

#Initialize the filename from the command-line argument

fn=$1

#Initialize counter

counter=1

#Set the internal field separator

IFS=$'\n'

#Read the file line by line

for val in $(cat "$fn")

do

#Print each line of the file with the line number

echo "Line-$counter: $val"

#Increment the counter

((counter++))

done

出力によれば、「cat」コマンドは、スクリプトを実行する前に「courses.txt」ファイルの元の内容を確認するために使用されます。その後、「courses.txt」を最初のコマンドライン引数として指定してスクリプトが実行されます。

「While」ループを使用してファイルを読み込む

以下のスクリプトは、ファイル名がコマンドライン引数として与えられたファイルの内容を読み取るために「while」ループの使用を示しています。このスクリプトでは「$counter」変数も使用され、ファイルの各行に行番号を印刷します。

#!/bin/bash

#Initialize the counter

counter=1

#iterate the loop to read the file line by line

while read -r line

do

#Print each line with the line number

echo "Line-$counter: $line"

#Increment the counter

((counter++))

#Read the filename from the command-line argument

done < "$1"

提供されたスクリプトの出力は、前の例に似ています。

ファイルのサイズを計算する

ファイルのサイズは、Bashスクリプトを使用して異なる方法で計算できます。以下のスクリプトでは、“stat”コマンドと“-c”オプションを使って、ファイルのサイズをバイト単位で計算します。ファイル名はユーザーから取得されます。ファイルが存在し、かつ空でない場合にファイルのサイズが出力されます。そうでなければ、エラーメッセージが表示されます。

#!/bin/bash

#Take the filename from the user

read -p "Enter an existing filename: " fn

if [ -s $fn ]

then

#Count the size of the file

size=$(stat -c %s $fn)

#Print the file size in bytes

echo "The size of the $file file is $size bytes."

else

echo "File does not exist or empty."

fi

次の出力は、前のスクリプトを実行した後に表示されます。ここで、“courses.txt”ファイルのサイズは153バイトです:

ファイルにコンテンツを追加する

「>>」演算子は、Bashでファイルの内容を追加するために使用されます。「courses.txt」ファイルに新しい行を追加するために「echo」コマンドを使用する必要があるとします。「echo」コマンドを実行して「courses.txt」ファイルの末尾に新しい行を追加する前と後に「cat」コマンドを実行してください。

cat courses.txt

echo "CSE-202 Data Structure" >> courses.txt

cat courses.txt

前のコマンドを実行した後に以下の出力が表示されます。“courses.txt”ファイルの最後に新しい行が追加されます:

ファイルのコピーを作成する

「cp」コマンドは、既存のファイルから新しいファイルを作成するために使用されます。以下のスクリプトは、「courses.txt」ファイルの内容をコピーして「courses_copy.txt」という新しいファイルを作成します:

#!/bin/bash

#Define the source and destination filename

source_file="courses.txt"

destination_file="courses_copy.txt"

if [ -f $source_file ]

then

#Copy the file if exists

cp $source_file $destination_file

echo "File is copied successfully."

else

echo "Source file does not exist."

fi

現在の場所に「copy.txt」ファイルが存在する場合、次の出力が表示されます。次に、「cat」コマンドが実行されて、ファイルの内容が正しくコピーされているかどうかを確認します:

ファイルの場所を移動する

「mv」コマンドは、1つの場所から別の場所にファイルを移動するために使用されます。「courses_copy.txt」ファイルの内容を確認し、ファイルを「temp」場所に移動し、ファイルが正常に移動したかどうかを確認するために、以下のコマンドを実行してください。

cat courses_copy.txt

mv courses_copy.txt temp

cat temp/courses_copy.txt

次の出力は、「courses_copy.txt」ファイルが「temp」フォルダーに成功裏に移動されたことを示しています。

ファイルの総行数をカウントする

Bashには、総行数をカウントするための複数のコマンドがあります。次のスクリプトでは、「wc」、「sed」、および「awk」コマンドを使用して、ユーザーから取得するファイルの総行数をカウントします。ユーザーから取得したファイル名が存在しない場合は、エラーメッセージが表示されます。

#!/bin/bash

#Take the filename from the user

read -p "Enter an existing filename: " fn

if [ -s $fn ]

then

#Count total lines of the file using `wc`, `sed`, and `awk` commands

wc_lines=$(wc -l < $fn)

sed_lines=$(sed -n '$=' $fn)

awk_lines=$(awk 'END { print NR }' $fn)

#Print the output of different commands

echo "Total lines (wc): $wc_lines"

echo "Total lines (sed): $sed_lines"

echo "Total lines (awk): $awk_lines"

else

#Print a message if the file does not exist or is empty

echo "File does not exist or empty."

fi

以下の出力は、スクリプトで使用される3つのコマンドの出力が同じであり、「courses.txt」ファイルが6行を含んでいることを示しています:

ファイル内の内容を検索する

「grep」コマンドは、検索語や正規表現パターンを使用してファイル内の任意のコンテンツを検索するために使用されます。「grep」コマンドで特定の検索語を使用してファイル内のコンテンツを検索する方法は、以下のスクリプトに示されています。ここで、「-i」オプションはケースを無視することを示しています。したがって、検索語はファイル内で大文字と小文字を区別せずに検索されます。

#!/bin/bash

#Take the filename from the user

read -p "Enter an existing filename: " fn

#Take the search word from the user

read -p "Enter the search word: " src

if [ -s $fn ]

then

#Search the particular word in the file

output=$(grep -i $src $fn)

if [ "$output" != "" ]

then

#Print the output of the `grep` command

echo "$output"

fi

else

#Print a message if the file does not exist

echo "File does not exist or empty."

fi

次の出力は、「courses.txt」というファイル名とCSE-208という検索語を使用してスクリプトを実行した後に表示されます。ファイルの2行目には「CSE208」という単語が含まれています。

正規表現を使用してファイルの内容を検索および置換する

「sed」コマンドは、Bashでファイルの内容を検索および置換する方法の一つです。以下のスクリプトでは、「sed」コマンドの「-i」オプションを使用してファイルの内容を検索および置換する方法が示されています。ファイル名、検索語、および置換語はユーザーから取得されます。

#Take the filename

read -p "Enter an existing filename: " fn

#Take the search word

read -p "Enter the search word: " src

#Take the replace word

read -p "Enter the replace word: " rep

if [ -s $fn ]

then

#Search and replace the particular word in the file

sed -i "s/$src/$rep/" $fn

else

#Print a message if the file does not exist

echo "File does not exist or empty."

fi

スクリプトを実行する前後で「courses.txt」ファイルの内容を確認するために、以下の出力を実行してください:

cat courses.txt

bash file11.bash

cat courses.txt

次の出力は、CSE-303という検索ワードが「courses.txt」ファイルに存在し、CSE-307という置き換えワードに置き換えられたことを示しています:

ファイルを削除する

「rm」コマンドは、Bashでファイルを削除するために使用されます。このコマンドは、以下のスクリプトで「-i」オプションと共に使用され、ファイルが存在する場合に削除します。ここでは、ファイル名はユーザーから取得されます。

#!/bin/bash

Take the filename

read -p 'Enter the filename: ' fn

Check the existence of the file

if [ -f $fn ]; then

Remove the file

rm -i "$fn"

Check whether the file is removed or not

if [ -e fn ]; then

echo "File is not removed."

else

echo "File is removed."

fi

else

echo "File does not exist."

fi

出力によると、「t.txt」ファイル名は現在の場所にあり、確認後にファイルは削除されます。

結論

このチュートリアルでは、Bashにおけるさまざまな種類のファイル操作について説明します。このチュートリアルのスクリプトは、Bashユーザーがファイルの作成、ファイルの追加、ファイルサイズの計算、内容の検索、内容の置換、ファイルの削除など、さまざまなファイル関連のタスクを理解するのに役立ちます。