シェル操作の基礎と注意點
シェル環境では効率的な操作を支援する機能が備わっています。コマンド入力中の Tab キーによる自動補完、バックスラッシュ(\)による長いコマンドの改行、コマンド --help によるマニュアル参照が基本です。オプションは単独または結合して指定可能であり、rm -r -f は rm -rf と同等に動作します。
パスやパターンマッチングでワイルドカード(* や ?)を使用する場合は、引用符(" や ')で囲まないよう注意が必要です。囲むとシェル展開が行われず、文字列としてそのまま渡されてエラーになります。
# ワイルドカード展開の正しい扱い
BASE_DIR=./app_data
# 正しい展開
ls -l $BASE_DIR/*/bin
# 誤例:展開されずエラー
ls -l "$BASE_DIR/*/bin"
シェルスクリプト内で別スクリプトを実行する場合、終了ステータスを確認してエラーハンドリングを行うのが安全です。
# 失敗時にスクリプトを終了
sh deploy.sh || exit 1
# 失敗時に後続処理を実行
sh deploy.sh
if [ $? -ne 0 ]; then
log_msg="デプロイ失敗: $?"
echo "$log_msg" >> /var/log/app_status.log
else
echo "正常完了"
fi
ファイル・ディレクトリ管理
ディレクトリ移動とパス操作には cd 系コマンドを使用します。絶対パス指定や .. による親ディレクトリへの移動、~ によるホームディレクトリへの復帰が標準的です。ディレクトリ作成には mkdir -p を用いると、中間ディレクトリが存在しなくても階層ごと生成できます。
ファイル操作は touch(空ファイル作成)、cp(コピー)、mv(移動・リネーム)、rm -rf(強制削除)が中心となります。再帰的な操作が必要な場合は -r オプションを追加します。
# 詳細なファイル属性の確認
ls -lh /var/log/
# 条件に応じたファイル検索
find /opt/services -name "*.conf" -type f
# ディレクトリサイズの一括確認(人間可読形式)
du -sh /var/lib/data/* | sort -rh
ファイル内容の閲覧には cat(全文)、head/tail(先頭・末尾)、tail -f(リアルタイム監視)が頻用されます。行数やバイト数の統計取得には wc コマンドを使用し、-l(行数)、-w(単語数)、-c(バイト数)で出力を切り替えられます。
テキスト処理とデータフィルタリング
テキストデータのパースには「三剑客」と呼ばれる grep、sed、awk が中核となります。
grep は行単位の抽出に特化しており、正規表現(-E)、大文字小文字無視(-i)、再帰検索(-r)、行番号表示(-n)などのオプションが揃っています。行の先頭(^)や末尾($)のマッチングも可能です。
sed はストリームエディタとして機能し、文字列の置換や行削除に優れています。-i オプションを付与すると対象ファイルを上書き変更します。正規表現によるグループ化(\1, \2)を用いたフォーマット変換も可能です。
# ログからERROR行を抽出し、行番号付きで表示
grep -n -E "ERROR|FATAL" app.log
# 日付フォーマットの変換(YYYYMMDDHHmm → YYYY-MM-DD HH:mm)
echo "202408151430" | sed -E 's/(....)(..)(..)(..)(..)/\1-\2-\3 \4:\5/'
sort はテキストの整列に使用されます。数値ソート(-n)、逆順(-r)、重複排除(-u)に加え、-k でソート対象の列、-t で区切り文字を指定できます。複数列ソートは sort -k1,1n -k2,2n のように列範囲を明示すると確実です。
Bash組み込みの文字列切り出し(${var:offset:length})や cut コマンドも、ログ解析やデータ整形でよく利用されます。
データフローとリダイレクト制御
パイプ(|)はコマンドの標準出力を次のコマンドの標準入力に接続します。しかし、date や rm のように標準入力ではなくコマンドライン引数を要求するコマンドには直接パイプ接続できません。ここで xargs が中継役となり、標準入力を引数に変換してコマンドを実行します。
# 複数のファイルをバックグラウンドで処理
find /data/archive -name "*.zip" | xargs -n 2 -P 4 unzip -o
# スペースを含む入力を単一引数として扱う
echo "2024-08-15 14:30" | xargs -I {} date -d "{}" +%s
リダイレクト演算子は出力先を制御します。> はファイルの上書き、>> は末尾追加、2> はエラー出力の分離を意味します。標準出力と標準エラーを統合して1つのファイルに保存する場合は 2>&1 を使用します。出力が不要な場合は /dev/null に廃棄しますが、これによりコマンドの終了ステータス($?)には影響しません。
analyze_report.sh > result.log 2>&1
echo "ステータス: $?"
ヒアドキュメント(<<DELIM)を使用すると、対話型コマンドやスクリプトに対して複数行の入力を直接渡すことができます。
システムリソースとプロセス管理
ファイルの所有権変更は chown、アクセス権限の調整は chmod が担当します。所有者とグループを同時に再帰的に変更する場合、chown -R user:group /target/dir が標準的な用法です。権限は数値(755 など)またはシンボル(u+x、a-w)で指定可能です。
プロセス管理では ps -ef や ps aux でシステム全体の動作状況を確認し、kill -9 PID で強制終了します。Java環境では jps がVM実行中のプロセス一覧を簡潔に表示します。バックグラウンドジョブの完了待ちには wait コマンドを使用し、プロセスIDを指定すれば特定タスクのみ、省略すれば直前のバッチ処理全体を待機します。
# 指定プロセスの待機とステータス表示
task_runner.sh &
pid=$!
wait $pid
echo "タスク終了コード: $?"
メモリ使用量の確認は free -h が推奨され、物理メモリとスワップの合計・使用済み・空き容量を人間可読形式で出力します。一時停止には sleep 5(秒)、sleep 1m(分)などが利用可能です。
ネットワーク転送とアーカイブ操作
他ホストとのデータ連携には scp と rsync が用いられます。scp -r は全量をコピーするため初期同期に適し、rsync -avz は差分のみ転送するため定期的な同期や大容量データで効率的です。
# rsyncによる差分同期(SSH経由)
rsync -avz --progress ./app_config/ user@remote:/opt/deploy/config/
Webからのファイル取得には wget が便利です。-c で断点再開、-b でバックグラウンド実行、-O で出力ファイル名の変更、--limit-rate で帯域制限が可能です。
アーカイブ作成と展開は tar が標準です。tar -czvf archive.tar.gz /source で gzip 圧縮付きのアーカイブを作成し、tar -xzvf archive.tar.gz -C /dest で指定ディレクトリに展開します。圧縮時に特定のファイルを除外するには --exclude を使用します。
Java環境の jar コマンドは jar tf でアーカイブ内一覧を表示し、jar xf でファイルを抽出できます。rpm パッケージの導入は rpm -ivh package.rpm で実行し、--prefix でインストール先をカスタマイズ可能です。シンボリックリンクの作成は ln -s /real/path /link/path です。
日付処理・環境設定・可視化
date コマンドは現在時刻の表示、フォーマット変換、日付演算を担います。date +%Y%m%d%H%M%S でカスタム形式を出力し、date -d "1 day ago" +%Y-%m-%d で相対的な日付計算が可能です。タイムスタンプへの変換には %s を使用します。
# 現在時刻から24時間後のUNIXタイムスタンプを取得
date -d "+1 day" +%s
環境変数やコマンドの所在確認には which や env を使用します。シェルのカスタマイズは ~/.bashrc に記述し、alias short_cmd='long_command --flags' の形式でショートカットを定義します。設定反映には source ~/.bashrc を実行します。
ディレクトリ構造の可視化には tree コマンドが有用です。-d でディレクトリのみ表示、-L 2 で再帰階数を制限、-F でファイル種別を記号付加して表示できます。これによりツリー構造を視覚的に把握しやすくなります。