find/grep/awkマスターシリーズ プロ編
演習問題とトラブルシューティング
シリーズ最終編。実力確認のための演習問題、よくあるトラブルの解決法、スキルアップのロードマップを提供。Linux上級者への仕上げを行います。
9. よくある問題と解決法
実務で使っていると、必ず遭遇する典型的な問題と解決策を事前に知っておきましょう。
🔍 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"
❌ ファイル名に空白があるとエラー
症状:
find /home -name "*.txt" -exec rm {} \;
# エラー: "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 # csvtoolコマンドを使用
Pythonとの連携
python3 -c "
import csv, sys
reader = csv.reader(sys.stdin)
for row in reader: print(row[0], row[1])
" < data.csv
❌ 数値計算で精度が落ちる
症状:小数点の計算結果が不正確
awk '{sum+=$1} END {print sum}'
# 期待: 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
10. さらなるスキルアップ
find、grep、awkをマスターしたあなたが次に学ぶべきスキルとキャリアパスを紹介します。
🎯 次のレベルのコマンド
🚀 スキルアップの道筋
📈 レベル1: コマンド習得(現在地)
達成済み:find、grep、awkの基本から応用まで
市場価値:年収+150万円レベル
📈 レベル2: シェルスクリプト作成
目標:複数コマンドを組み合わせた自動化スクリプト
学習期間:2-3ヶ月
市場価値:年収+300万円レベル
📈 レベル3: システム管理・自動化
目標:サーバー運用の自動化
学習期間:4-6ヶ月
市場価値:年収+500万円レベル
📈 レベル4: DevOps・クラウド
目標:CI/CD、インフラ自動化
学習期間:6-12ヶ月
市場価値:年収+700万円レベル
📚 推奨学習リソース
🐧 継続学習
📖 書籍・教材
「シェルスクリプト高速開発手法」
実用的なシェルスクリプト作成技法
「入門 監視」
システム監視の基礎から実践まで
🏅 資格・認定
LPIC Level 1
Linux基礎スキルの客観的証明
AWS Solutions Architect
クラウドインフラ設計スキル証明
💼 キャリアパス例
🛠️ インフラエンジニア方向
到達年収:800-1200万円
📊 データエンジニア方向
到達年収:750-1100万円
🔄 DevOpsエンジニア方向
到達年収:900-1300万円
11. 🎯 演習問題とチャレンジ:実力確認
理論だけでなく実際に手を動かしてスキルを定着させましょう。以下の演習問題に取り組んで、あなたの実力を確認してください。
🟢 初級チャレンジ
基本的なコマンドの使い方を確認します。
チャレンジ1: ファイル検索の基本
課題:/var/log ディレクトリ以下から、拡張子が.log で、サイズが1MB以上のファイルを見つけてください。
💡 ヒント
find コマンドで -name と -size オプションを組み合わせます
🎯 解答例
find /var/log -name "*.log" -size +1M
チャレンジ2: テキスト検索の基本
課題:system.log ファイルから "ERROR" を含む行を検索し、行番号付きで表示してください。
🎯 解答例
grep -n "ERROR" system.log
チャレンジ3: データ集計の基本
課題:sales.csv ファイルの3列目(売上)の合計を計算してください。
🎯 解答例
awk -F',' '{sum += $3} END {print "合計:", sum}' sales.csv
🟡 中級チャレンジ
複数のコマンドを組み合わせた実践的な問題です。
チャレンジ4: ログ分析パイプライン
課題:アクセスログから今日のユニークIPアドレス数を数えてください。
💡 ヒント
grep で今日の日付を検索 → awk でIPアドレス抽出 → sort/uniq で重複除去
🎯 解答例
grep "$(date '+%d/%b/%Y')" access.log | awk '{print $1}' | sort -u | wc -l
チャレンジ5: 大容量ファイル検索
課題:ホームディレクトリから100MB以上の大きなファイルTOP5を見つけ、サイズ順に表示してください。
🎯 解答例
find /home -type f -size +100M -exec ls -lh {} \; | sort -rh -k5 | head -5
チャレンジ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アドレスを特定し、アラートメッセージを生成してください。
💡 ヒント
時間フィルタ → 404エラー抽出 → IP別集計 → しきい値判定
🎯 解答例
# 1時間前の時刻を取得
hour_ago=$(date -d '1 hour ago' '+%d/%b/%Y:%H')
current_hour=$(date '+%d/%b/%Y:%H')
# 404エラーの多いIPを検出
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ファイルのデータ品質をチェックし、以下を報告するスクリプトを作成してください:
- 総行数、列数
- 空白行の数
- 各列のユニーク値数
- 数値列の最大・最小・平均値
🎯 解答例
awk -F',' '
BEGIN {
print "=== CSV Data Quality Report ==="
}
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_values[i][++numeric_count[i]] = $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
print ""
for (i = 1; i <= num_columns; i++) {
printf "列%d (%s):\n", i, headers[i]
printf " ユニーク値数: %d\n", length(field_values[i])
if (numeric_count[i] > 0) {
avg = numeric_sum[i] / numeric_count[i]
printf " 数値統計: 最小=%.2f, 最大=%.2f, 平均=%.2f\n", numeric_min[i], numeric_max[i], avg
}
print ""
}
}' data.csv
チャレンジ9: 自動バックアップスクリプト
課題:重要なファイルの自動バックアップスクリプトを作成してください。以下の機能を含めてください:
- 前回バックアップ以降に更新されたファイルのみ対象
- ファイルサイズが100MB未満のもののみ
- バックアップ処理のログ生成
- 古いバックアップの自動削除(7日以上前)
🎯 解答例
#!/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"
# 前回バックアップのタイムスタンプ取得
if [[ -f "$LAST_BACKUP_MARKER" ]]; then
LAST_BACKUP=$(cat "$LAST_BACKUP_MARKER")
echo "Last backup: $LAST_BACKUP" >> "$LOG_FILE"
else
LAST_BACKUP="1970-01-01"
fi
# 更新されたファイルを検索してバックアップ
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"
((backed_up_count++))
else
echo "Failed to backup: $file" >> "$LOG_FILE"
fi
done
# 古いバックアップの削除
find /backup -type d -mtime +7 -exec rm -rf {} + 2>/dev/null
echo "Old backups cleaned up" >> "$LOG_FILE"
# タイムスタンプ更新
date > "$LAST_BACKUP_MARKER"
echo "=== Backup completed. Files backed up: ${backed_up_count:-0} ===" >> "$LOG_FILE"
🏆 マスターチャレンジ
プロレベルの問題です。現場で即戦力となるスキルを証明できます。
チャレンジ10: 総合システム監視ダッシュボード
最終課題:以下の機能を持つシステム監視スクリプトを作成してください:
- リアルタイムでログファイルを監視
- エラー発生時の自動アラート
- システムリソース使用状況の可視化
- 日次レポートの自動生成
- Web画面での確認(HTMLレポート生成)
💡 アプローチのヒント
tail -f でリアルタイム監視、awk で統計処理、find で古いファイル管理、HTMLテンプレートでレポート生成
🎯 達成報酬:このチャレンジを完了できれば、あなたは確実にLinux上級者です!
🤝 学習サポート
12. 🎉 まとめ:Linux上級者への第一歩
この4部作のシリーズでは、find、grep、awkの3つのコマンドについて、基礎から実践的な応用まで詳しく解説しました。これらのコマンドをマスターすることで、あなたは真のLinux上級者に到達できます。
🏆 習得したスキル
📚 シリーズ振り返り
📊 期待される効果
💪 あなたはもうLinux上級者です
この4部作シリーズの内容を理解し、実践できるようになったあなたは、もうLinuxの上級者です。多くのエンジニアが知らない高度な技術を身につけました。自信を持って、さらなるスキルアップに挑戦してください。