1. ファイル内の文字列を一括置換する(sed)
設定ファイルに書かれたホスト名やIPアドレスなどをまとめて置き換えたい場合は、sed コマンドが便利です。次の例では、config.txt 内にあるすべての localhost を 192.168.1.10 に置換します。
sed -i 's/localhost/192.168.1.10/g' config.txt
-i オプションを付けることで、結果を画面に出力するのではなく、ファイルそのものを直接上書き更新します。
s は文字列の置換、末尾の g は各行に一致する文字列をすべて置換する指定です。g を省略すると、各行で最初に一致した箇所だけが置換されます。
-i を使うと元のファイルが直接更新されます。重要な設定ファイルでは、事前にコピーを取るか、まず -i を外して置換結果を確認してください。2. 1行テキストの上書き・追記(echo)
設定ファイルに1行だけ足したい、あるいは中身を短い言葉で丸ごと上書きしたい場合に重宝します。
ファイルの中身を完全に上書きする
> を使います。既存の内容は消え、指定したテキストだけがファイルに保存されます。
echo "Hello World" > memo.txt
ファイルの末尾に1行追記する
>> を使います。既存の内容は残したまま、その末尾に新しい行を追加します。
echo "追加のテキスト" >> memo.txt
> と >> の違い> はファイル全体を上書きし、>> は末尾へ追記します。既存の内容を残したい場合は、誤って > を使わないよう注意してください。3. 複数行のテキストをスマートに書き込む(catとヒアドキュメント)
複数行にわたる設定内容などを、エディタを開かずに一気にファイルへ書き込みたい場合は、cat コマンドと EOF(ヒアドキュメント)の組み合わせが非常に便利です。
複数行の設定をファイルへ上書きする
次の例では、ポート番号、ホスト名、デバッグ設定をまとめて setup.conf に書き込みます。
cat << 'EOF' > setup.conf
port=8080
host=localhost
debug=true
EOF
最初の行に続けて入力した内容から、最後の EOF の直前までが、そのまま setup.conf に上書き保存されます。既存の内容を残して末尾に追記したい場合は、> を >> に変更します。
区切り文字を 'EOF' のように引用符で囲むと、本文中の $変数 やコマンド置換が展開されず、入力した文字列をそのまま書き込めます。
4. その他、中身を確認するのによく使う便利コマンド
ファイルを書き換える前や後に、中身をさっと確認するためのコマンドです。
grep(検索)
ファイルの中から、特定の文字列を含む行だけを抜き出して表示します。次の例では、application.log から「エラー」を含む行を検索します。
grep "エラー" application.log
配下のディレクトリも含めて、特定の文字列を含む行をまとめて探したい場合は、-R、-n、-i を組み合わせます。次の例では、現在のディレクトリ以下から --app を含む行を検索します。
grep -Rni -e "--app" .
-R はサブディレクトリを再帰的に検索する指定、-n は行番号を表示する指定、-i は大文字小文字を区別しない指定です。検索したい文字列が --app のようにハイフンで始まる場合は、オプションと誤解されないように -e で検索パターンとして渡します。
tail(末尾の確認)
ファイルの最後の数行だけを表示します。次の例では、application.log の末尾10行を確認します。ログの直近の出力を見たい場合に便利です。
tail -n 10 application.log
less(スクロール表示)
巨大なファイルの内容を、画面を埋め尽くさずにスクロールしながら確認できます。次のようにファイル名を指定して開き、終了するには q を押します。
less application.log
5. ファイルを検索・削除する(find)
find は、指定したディレクトリ以下から条件に一致するファイルやディレクトリを探すコマンドです。次の例では、現在のディレクトリを起点として、配下にある config.txt を再帰的に検索します。
find . -name 'config.txt'
. は現在のディレクトリ、-name はファイル名による検索条件を表します。同じ名前のファイルが複数の階層にあっても、そのパスをまとめて確認できます。
検索したファイルをまとめて削除する
find の検索結果を xargs rm に渡すと、該当するファイルをまとめて削除できます。
find . -name 'old_log.txt' | xargs rm
このコマンドは、現在のディレクトリ以下にあるすべての old_log.txt を削除します。元に戻せないため、最初に find . -name 'old_log.txt' だけを実行し、対象が正しいことを確認してから削除してください。
find . -name 'old_log.txt' -print0 | xargs -0 rm を使います。GNU環境では、検索と削除を一つのコマンドで行う find . -name 'old_log.txt' -delete も利用できます。6. データから特定の列だけを抜き出す(awkとcut)
ログファイルやCSVファイルから「IPアドレスだけ」「特定の項目の値だけ」をさっと抽出したい時に便利です。
awk(空白区切りのデータに強い)
次の例では、access.log の各行から1番目の項目だけを抽出して表示します。一般的なアクセスログでIPアドレスが先頭に記録されている場合は、IPアドレスの一覧を取り出せます。
awk '{print $1}' access.log
cut(カンマ区切りなどのデータに強い)
次の例では、カンマ区切りの data.csv から2番目の項目だけを抽出して表示します。-d ',' で区切り文字をカンマに指定し、-f 2 で2番目のフィールドを選択しています。
cut -d ',' -f 2 data.csv
ただし、値の中にカンマや改行を含む正式なCSVを扱う場合は、単純な cut では正しく分割できないことがあります。その場合は、CSVに対応した専用ツールやプログラムを使います。
7. ファイル同士の違いを比較する(diff)
設定ファイルを書き換えた後、「元のファイルからどこが変わったのか」を差分として確認できます。
変更箇所を分かりやすく表示する
次の例では、変更前の old_setting.conf と変更後の new_setting.conf を比較します。
diff -u old_setting.conf new_setting.conf
-u オプションを付けると、前後の文脈を含むユニファイド形式で差分が表示されます。追加された行は +、削除された行は - で始まるため、変更点を直感的に確認できます。
差分がなければ何も表示されません。また、差分が見つかった場合に終了ステータス 1 を返しますが、これは比較に失敗したという意味ではありません。
8. リアルタイムで変化を監視する(watch)
ファイルの中身やディレクトリの状態が変化していく様子を、画面を更新し続けながら確認できるコマンドです。
1秒ごとにコマンドを実行して画面を更新する
次の例では、ls -l を1秒ごとに自動で繰り返し実行します。
watch -n 1 ls -l
-n 1 は、実行間隔を1秒に指定するオプションです。ファイルのダウンロード状況や、ログファイルのサイズが大きくなっていく様子などを監視する際に便利です。監視を終了するには Ctrl + C を押します。
前回の実行結果から変化した部分を強調したい場合は、-d オプションも追加できます。
watch -d -n 1 ls -l
9. 空のファイルをさっと作る(touch)
エディタを開かずに、とりあえず空のファイルを用意したい時に最も手早く使えるコマンドです。
空ファイルを作成する
次の例では、現在のディレクトリに new_script.sh という空ファイルを作成します。
touch new_script.sh
指定した名前のファイルがすでに存在する場合、中身は削除されず、ファイルのアクセス日時と更新日時が現在時刻に変更されます。
10. ディレクトリを中身ごと削除する(rm)
ファイルが入っているディレクトリを、配下のファイルやサブディレクトリも含めて削除するには、rm に -r オプションを付けます。
ディレクトリを再帰的に削除する
rm -r old_project
-r は再帰的に処理するためのオプションです。この例では、old_project ディレクトリと、その中にあるすべてのファイルやディレクトリを削除します。
一つずつ確認しながら削除する
削除前に確認を挟みたい場合は、-i オプションを追加します。
rm -ri old_project
確認メッセージに対して削除してよければ y、残したければ n を入力します。
rm -rf old_project は確認せず強制的に削除するため便利ですが、パスを間違えると必要なデータまで失います。実行前に pwd と ls -la old_project で場所と中身を確認し、変数、ワイルドカード、管理者権限との組み合わせは特に慎重に扱ってください。中身が空のディレクトリだけを削除したい場合は、より対象を限定できる rmdir も使えます。
rmdir empty_directory