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 上級者と言える。