シェルスクリプトで脱・手作業!面倒な繰り返しタスク自動化入門
【実戦編】シェルスクリプトで「面倒な繰り返し作業」をゼロにする方法
皆さん、日々の開発や運用タスクの中で、「同じことを何回も手動で行っている…」という経験はありませんか?例えば、「このディレクトリ内に似た名前のファイルを大量にコピーし、それぞれに目印となる日付を付与する」「複数のログファイルから特定のパターンだけを抽出して集計する」といった作業です。
このような繰り返しのタスクこそ、シェルスクリプトの真骨頂が活きる領域です。単なる「Hello World」的な入門コードではなく、実際に手を動かして環境に組み込める実用的な自動化を実現するための視点をご紹介します。
課題提起:なぜ手作業は非効率なのか?
もしあなたがWebサービスのログファイルを数時間かけて分析しなければならないとしましょう。そのログファイルが100個も存在し、それぞれから「HTTPステータスコードが4xx帯のもの」だけを抜き出して、「どのIPアドレスから何回発生したか」を知りたいとします。
手作業でこれを行うのは至難の業です。どこかでミスを誘発しやすく、時間もかかるばかりです。
実践テーマ:ログ集計のためのパイプライン構築
このような複数のファイルにわたるデータを処理する最適な方法は、シェルが持つ「パイプ (|)」とループ構造を活用することです。単なる一連のコマンドではなく、「プロセスを連続的に流し込む」仕組みを構築します。
必要なツール
- ls: ファイル一覧を取得する
- grep: パターンマッチング(フィルタリング)を行う
- awk: カラム単位でのデータ処理や集計を行う
実例:指定ディレクトリ内の全ログから特定のIPアドレスと回数をカウントするスクリプト
以下のコードは、現在のディレクトリにあるすべてのaccess.logファイルに対して実行されることを想定した概念的なサンプルです。
#!/bin/bash
# 変数定義(処理対象のディレクトリ)
LOG_DIR="/var/log/api"
OUTPUT_FILE="ip_count_report.txt"
echo "--- ログ集計を開始します ---" > "$OUTPUT_FILE"
# ディレクトリ内の全てのログファイルをループで巡回する
for logfile in ${LOG_DIR}/*.log; do
if [ -f "$logfile" ]; then
echo "==> $logfile の処理中..."
# 1. grepでIPアドレスを含む行に絞り込む (効率化)
grep "([0-9.]*){3}" "$logfile" | \
# 2. awkを使って、最初に出現したフィールド(IPアドレス)だけを抽出する
awk '{print $1}' | \
# 3. sortでソートし、uniq -c で出現回数カウントを行う
sort | uniq -c >> "$OUTPUT_FILE"
fi
done
echo "" >> "$OUTPUT_FILE"
echo "--- 集計が完了しました。結果は $OUTPUT_FILE に出力されました ---"
コード解説:このスクリプトの「実践的な」ポイント
この一見複雑な流れを、分解して理解することが重要です。
1. for ループの活用
for logfile in ${LOG_DIR}/*.log; do
ディレクトリ内の全てのファイルを確実に一つずつ処理するための最も基本的な構造です。シェルスクリプトで「複数の対象に同じ処理を適用したい」場合に、まず考えるべき基本文法です。
2. パイプ (|) の連鎖
grep ... | awk ... | sort | uniq -c
パイプは「前段のコマンドの標準出力を、後段のコマンドの標準入力として渡す」という機能を持っています。この仕組みにより、「フィルタリング → データ抽出 → 並び替え → カウント」といった複雑なデータ処理を、非常に短く簡潔な構文で実現できます。
3. 変数と論理構造
OUTPUT_FILE
あらかじめ変数に出力ファイル名を定義し、スクリプトのどの部分からも参照できるようにしておくと、後からファイルを移したり名前を変えたりする際も修正箇所が少なく済み、管理しやすいコードになります。また、if [ -f "$logfile" ]; then のように存在チェックを行うことで、処理対象が本当にファイルなのかを保証し、エラーを防いでいます。
まとめ
シェルスクリプトは単なるコマンドの寄せ集めではありません。それは「OSの機能やツール(grep, awkなど)を組み合わせるためのオーケストレーション言語」です。手作業で複数のステップを踏んでいる業務プロセスを見直し、「どの情報がどこを経由して、どう処理されているか」というフローチャートを組むことから始めてみてください。
「これが自動化できたら助かるな」と感じたタスクこそ、次に学ぶべきシェルスクリプトの実践課題です。ぜひ今日学んだ知識を、あなたの実務の「面倒な繰り返し作業」の解決に役立てていただければ幸いです。
コメント
コメントを投稿