find・grep・awkの演習問題 - トラブルシューティングと実践力強化

find・grep・awkの演習問題 - トラブルシューティングと実践力強化

シリーズ最終編。実力確認のための演習問題、よくあるトラブルの解決法、スキルアップのロードマップを提供する。Linux 上級者への仕上げを行う。

よくある問題と解決法

実務で使っていると、必ず遭遇する典型的な問題と解決策を事前に知っておく。

findコマンドの問題

Permission denied エラーが大量に出る

症状:

find: '/root': Permission denied
find: '/proc/1': Permission denied

解決法:

# 方法1: エラー出力を無視
find / -name "*.txt" 2>/dev/null

# 方法2: 権限のある場所のみ検索
find /home /var /tmp -name "*.txt"

# 方法3: sudoで実行(要注意)
sudo find / -name "*.txt"

ファイル名に空白があるとエラー

症状: "My Document.txt""My""Document.txt" として解釈してしまう。

解決法:

# -print0 と xargs -0 を使用
find /home -name "*.txt" -print0 | xargs -0 rm

# -exec with + を使用
find /home -name "*.txt" -exec rm {} +

検索が遅すぎる

解決法:

  • -path で不要ディレクトリをスキップ
  • -maxdepth で検索深度を制限
  • -type f でファイルのみに限定
find /var -maxdepth 3 -type f -path "*/node_modules" -prune -o -name "*.log" -print

grepコマンドの問題

日本語(多バイト文字)が正しく検索できない

解決法:

# ロケール設定を確認・変更
export LANG=ja_JP.UTF-8
grep "エラー" logfile.txt

# バイナリファイル扱いを回避
grep -a "エラー" logfile.txt

正規表現が期待通りに動かない

よくある問題: +?{} が文字として扱われる、() でのグループ化ができない。

解決法:

# -E で拡張正規表現を使用
grep -E "colou?r" file.txt
grep -E "(http|https)://" file.txt

# egrepエイリアスを使用
egrep "colou?r" file.txt

Binary file matches エラー

症状: Binary file image.jpg matches

解決法:

# テキストファイルのみ検索
grep -I "pattern" *

# ファイル種別を限定
grep -r --include="*.txt" --include="*.log" "pattern" .

awkコマンドの問題

フィールドが期待通りに分割されない

症状: CSV ファイルで項目内にカンマがある場合、"田中太郎","28","東京都渋谷区","エンジニア,チームリーダー" が正しく分割されない。

解決法:

# 専用ツールを使用
csvtool col 1,2 data.csv

# Pythonとの連携
python3 -c "
import csv, sys
reader = csv.reader(sys.stdin)
for row in reader: print(row[0], row[1])
" < data.csv

数値計算で精度が落ちる

症状: 小数点の計算結果が不正確(期待 10.50、実際 10.5000000001)。

解決法:

# printf で桁数指定
awk '{sum+=$1} END {printf "%.2f\n", sum}' numbers.txt

# bcコマンドと連携
awk '{print $1}' numbers.txt | paste -sd+ | bc

デバッグテクニック

段階的な確認

複雑なコマンドは部分的に実行して確認する。

# 最終的なコマンド
find /var/log -name "*.log" | xargs grep -l "ERROR" | xargs wc -l

# デバッグ手順
# 1. find部分のみ実行
find /var/log -name "*.log"

# 2. grep部分まで実行
find /var/log -name "*.log" | xargs grep -l "ERROR"

# 3. 全体を実行
find /var/log -name "*.log" | xargs grep -l "ERROR" | xargs wc -l

中間結果の保存

長時間かかる処理は中間結果をファイルに保存する。

find /var -name "*.log" > all_logs.txt
grep -l "ERROR" $(cat all_logs.txt) > error_logs.txt
wc -l $(cat error_logs.txt) > final_result.txt

さらなるスキルアップ

find、grep、awk をマスターしたあなたが次に学ぶべきスキルを紹介する。

次のレベルのコマンド

sed(ストリームエディタ): テキストの置換・削除・挿入を高速実行。

sed 's/error/ERROR/g' logfile.txt

学習優先度: 最高。

xargs(引数変換): パイプ出力をコマンドライン引数に変換。

find . -name "*.txt" | xargs -P 4 wc -l

学習優先度: 最高。

sort/uniq(ソート・重複削除): データの並び替えと重複処理。

cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn

学習優先度: 高。

join/paste(ファイル結合): 複数ファイルのデータ結合。

join -t, file1.csv file2.csv

学習優先度: 中。

演習問題とチャレンジ

理論だけでなく実際に手を動かしてスキルを定着させる。以下の演習問題に取り組んで、実力を確認する。

初級チャレンジ

チャレンジ1: ファイル検索の基本

/var/log ディレクトリ以下から、拡張子が .log で、サイズが1MB以上のファイルを見つけよ。

チャレンジ1 ヒントを見る

find コマンドで -name-size オプションを組み合わせる。

チャレンジ1 解答例を見る
find /var/log -name "*.log" -size +1M

チャレンジ2: テキスト検索の基本

system.log ファイルから "ERROR" を含む行を検索し、行番号付きで表示せよ。

チャレンジ2 解答例を見る
grep -n "ERROR" system.log

チャレンジ3: データ集計の基本

sales.csv ファイルの3列目(売上)の合計を計算せよ。

チャレンジ3 解答例を見る
awk -F',' '{sum += $3} END {print "合計:", sum}' sales.csv

中級チャレンジ

チャレンジ4: ログ分析パイプライン

アクセスログから今日のユニーク IP アドレス数を数えよ。

チャレンジ4 ヒントを見る

grep で今日の日付を検索 → awk で IP アドレス抽出 → sort/uniq で重複除去。

チャレンジ4 解答例を見る
grep "$(date '+%d/%b/%Y')" access.log | awk '{print $1}' | sort -u | wc -l

チャレンジ5: 大容量ファイル検索

ホームディレクトリから100MB以上の大きなファイル TOP5 を見つけ、サイズ順に表示せよ。

チャレンジ5 解答例を見る
find /home -type f -size +100M -exec ls -lh {} \; | sort -rh -k5 | head -5

チャレンジ6: エラー統計レポート

複数のログファイルからエラーの種類別件数を集計し、多い順に表示せよ。

チャレンジ6 解答例を見る
find /var/log -name "*.log" | xargs grep -h "ERROR" | awk '{print $4}' | sort | uniq -c | sort -rn

上級チャレンジ

チャレンジ7: Webサイト監視スクリプト

Apache アクセスログから、過去1時間で 404 エラーが10回以上発生した IP アドレスを特定し、アラートメッセージを生成せよ。

チャレンジ7 ヒントを見る

時間フィルタ → 404エラー抽出 → IP別集計 → しきい値判定。

チャレンジ7 解答例を見る
hour_ago=$(date -d '1 hour ago' '+%d/%b/%Y:%H')
current_hour=$(date '+%d/%b/%Y:%H')

grep -E "($hour_ago|$current_hour)" /var/log/apache2/access.log | \
grep " 404 " | \
awk '{print $1}' | \
sort | uniq -c | \
awk '$1 >= 10 {printf "ALERT: IP %s has %d 404 errors in last hour\n", $2, $1}'

チャレンジ8: データ品質チェック

CSV ファイルのデータ品質をチェックし、総行数・列数、空白行の数、各列のユニーク値数、数値列の最大・最小・平均値を報告するスクリプトを作成せよ。

チャレンジ8 解答例を見る
awk -F',' '
NR == 1 {
    num_columns = NF
    for (i = 1; i <= NF; i++) headers[i] = $i
    next
}
NF == 0 { empty_lines++; next }
{
    total_rows++
    for (i = 1; i <= num_columns && i <= NF; i++) {
        field_values[i][$i] = 1
        if ($i ~ /^[0-9]+\.?[0-9]*$/) {
            numeric_count[i]++
            numeric_sum[i] += $i
            if (numeric_min[i] == "" || $i < numeric_min[i]) numeric_min[i] = $i
            if (numeric_max[i] == "" || $i > numeric_max[i]) numeric_max[i] = $i
        }
    }
}
END {
    printf "総行数: %d\n", total_rows
    printf "列数: %d\n", num_columns
    printf "空白行数: %d\n", empty_lines + 0
    for (i = 1; i <= num_columns; i++) {
        printf "列%d (%s): ユニーク値数=%d", i, headers[i], length(field_values[i])
        if (numeric_count[i] > 0) {
            avg = numeric_sum[i] / numeric_count[i]
            printf ", 最小=%.2f, 最大=%.2f, 平均=%.2f", numeric_min[i], numeric_max[i], avg
        }
        print ""
    }
}' data.csv

チャレンジ9: 自動バックアップスクリプト

重要なファイルの自動バックアップスクリプトを作成せよ。前回バックアップ以降に更新されたファイルのみ対象、ファイルサイズが100MB未満のもののみ、バックアップ処理のログ生成、古いバックアップの自動削除(7日以上前)を含めよ。

チャレンジ9 解答例を見る
#!/bin/bash

BACKUP_DIR="/backup/$(date +%Y%m%d_%H%M%S)"
LAST_BACKUP_MARKER="/var/log/last_backup.timestamp"
LOG_FILE="/var/log/backup.log"

echo "=== Backup started at $(date) ===" >> "$LOG_FILE"
mkdir -p "$BACKUP_DIR"

find /home/important -type f -size -100M -newer "$LAST_BACKUP_MARKER" 2>/dev/null | \
while read file; do
    rel_path="${file#/home/important/}"
    backup_path="$BACKUP_DIR/$rel_path"
    backup_dir=$(dirname "$backup_path")
    mkdir -p "$backup_dir"

    if cp "$file" "$backup_path" 2>/dev/null; then
        echo "Backed up: $file" >> "$LOG_FILE"
    fi
done

# 古いバックアップの削除
find /backup -type d -mtime +7 -exec rm -rf {} + 2>/dev/null

# タイムスタンプ更新
date > "$LAST_BACKUP_MARKER"

マスターチャレンジ

チャレンジ10: 総合システム監視ダッシュボード

以下の機能を持つシステム監視スクリプトを作成せよ。

  • リアルタイムでログファイルを監視
  • エラー発生時の自動アラート
  • システムリソース使用状況の可視化
  • 日次レポートの自動生成
  • Web 画面での確認(HTML レポート生成)
チャレンジ10 アプローチのヒント

tail -f でリアルタイム監視、awk で統計処理、find で古いファイル管理、HTML テンプレートでレポート生成。

このチャレンジを完了できれば、確実に Linux 上級者と言える。

まとめ:Linux上級者への第一歩

このシリーズでは、find、grep、awk の3つのコマンドについて、基礎から実践的な応用まで詳しく解説した。これらのコマンドをマスターすることで、真の Linux 上級者に到達できる。

習得したスキル

  • find: 任意の条件でファイル・ディレクトリを高速検索
  • grep: 正規表現を使った高度なテキスト検索
  • awk: データ処理・集計・レポート生成
  • 3つのコマンドの効果的な組み合わせ
  • パフォーマンス最適化とトラブルシューティング
  • 業界別実践事例と実務スキル
  • 演習問題と実力確認

シリーズ振り返り

  • 基礎編 — コマンドの概要と正規表現の基礎
  • 応用編 — grep と awk の高度なテクニック
  • 実践編 — 組み合わせと業務活用
  • プロ編 — 演習問題とトラブルシューティング(本記事)

期待される効果

  • 作業効率: 手動作業の大部分を自動化
  • 問題解決力: ログ解析やデータ分析が短時間で完了
  • キャリア: インフラ・データ・DevOps 分野への展開が可能

今すぐ実践しよう

学んだ知識を実際の業務で活用することが最も重要。Penguin Gym Linux で実践練習し、日常的にコマンドを使いこなすことで、真のスキルとして定着する。