find/grep/awkマスターシリーズ プロ編
演習問題とトラブルシューティング

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

📋 目次

  1. よくある問題と解決法
  2. さらなるスキルアップ
  3. 演習問題とチャレンジ
  4. まとめ: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をマスターしたあなたが次に学ぶべきスキルとキャリアパスを紹介します。

🎯 次のレベルのコマンド

📊 sed(ストリームエディタ)

テキストの置換・削除・挿入を高速実行

学習優先度:⭐⭐⭐⭐⭐

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

全ての"error"を"ERROR"に一括置換

🔄 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

共通キーでCSVファイル結合

🚀 スキルアップの道筋

📈 レベル1: コマンド習得(現在地)

達成済み:find、grep、awkの基本から応用まで

市場価値:年収+150万円レベル

📈 レベル2: シェルスクリプト作成

目標:複数コマンドを組み合わせた自動化スクリプト

学習期間:2-3ヶ月

市場価値:年収+300万円レベル

Bash scripting 条件分岐・ループ エラーハンドリング

📈 レベル3: システム管理・自動化

目標:サーバー運用の自動化

学習期間:4-6ヶ月

市場価値:年収+500万円レベル

cron/systemd ログ解析自動化 監視スクリプト

📈 レベル4: DevOps・クラウド

目標:CI/CD、インフラ自動化

学習期間:6-12ヶ月

市場価値:年収+700万円レベル

Docker Kubernetes AWS/GCP Terraform

📚 推奨学習リソース

🐧 継続学習

Penguin Gym Linux 上級コース

学んだコマンドを実際に練習できる環境。上級課題で実力向上

練習を続ける →

📖 書籍・教材

「シェルスクリプト高速開発手法」

実用的なシェルスクリプト作成技法

「入門 監視」

システム監視の基礎から実践まで

🏅 資格・認定

LPIC Level 1

Linux基礎スキルの客観的証明

AWS Solutions Architect

クラウドインフラ設計スキル証明

💼 キャリアパス例

🛠️ インフラエンジニア方向

現在のスキル + システム管理
サーバー構築・運用
クラウドインフラ設計
SRE・インフラアーキテクト

到達年収:800-1200万円

📊 データエンジニア方向

現在のスキル + データ処理
ETL・データパイプライン
ビッグデータ基盤構築
データアーキテクト

到達年収:750-1100万円

🔄 DevOpsエンジニア方向

現在のスキル + CI/CD
自動化・コンテナ技術
Kubernetes運用
プラットフォームエンジニア

到達年収: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上級者に到達できます。

🏆 習得したスキル

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

📚 シリーズ振り返り

基礎編

コマンドの概要と正規表現の基礎を学習

応用編

grepとawkの究極テクニックをマスター

実践編

組み合わせ技術と実務活用事例を習得

プロ編(完了)

演習問題とトラブルシューティングで総仕上げ

📊 期待される効果

90%
作業効率向上
+300万円
年収アップ期待値
95%
作業の自動化率

🚀 今すぐ実践しよう

知識を得ただけでは意味がありません。実際に手を動かして練習することで、初めてスキルが身につきます。

📅 今後の学習計画

  • Week 1: 演習問題1-3に挑戦(基礎の確認)
  • Week 2: 演習問題4-6に挑戦(実践的な組み合わせ)
  • Week 3: 演習問題7-9に挑戦(高度な技術)
  • Week 4: マスターチャレンジに挑戦(総合力試し)
  • 継続: 日常業務でのコマンド活用

💪 あなたはもうLinux上級者です

この4部作シリーズの内容を理解し、実践できるようになったあなたは、もうLinuxの上級者です。多くのエンジニアが知らない高度な技術を身につけました。自信を持って、さらなるスキルアップに挑戦してください。

🎓 おめでとうございます!あなたのLinuxマスターへの道のりは、確実に前進しています。

🎉 シリーズお疲れ様でした!

4つの記事を通じて、find/grep/awkの全てを学習されました。これであなたもLinux上級者の仲間入りです。