プロジェクト1: ログ分析システム
大規模なWebアプリケーションのアクセスログを分析するシステムを構築します。
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$
█
ファイルツリー
/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
システム要件
-
リアルタイム監視
- 新しいログエントリの即座な解析
- 異常パターンの自動検出
- アラート通知機能
-
統計レポート生成
- 時間別/日別のアクセス統計
- IPアドレス別の分析
- エラー率とパフォーマンス指標
-
データ可視化
- CSV/JSON形式での出力
- ダッシュボード用データの準備
#!/bin/bash
# log_analyzer_system.sh
# 設定
CONFIG_FILE="analyzer.conf"
ALERT_THRESHOLD_ERROR_RATE=5 # 5%以上でアラート
# リアルタイム解析関数
realtime_analysis() {
tail -f /var/log/access.log | while read line; do
# 即座にパターン解析
echo "$line" | awk '{
if ($9 >= 400) error_count++
total_count++
if (total_count % 100 == 0) {
error_rate = (error_count / total_count) * 100
if (error_rate > THRESHOLD) {
print "ALERT: Error rate " error_rate "%" | "logger -t WebAlert"
}
}
}' THRESHOLD=$ALERT_THRESHOLD_ERROR_RATE
done
}
# 統計レポート生成
generate_report() {
local log_file="$1"
local date=$(date +%Y-%m-%d)
awk '
BEGIN {
print "=== Web Access Analysis Report ==="
print "Date: " date
print ""
}
{
# IPアドレス別統計
ip_count[$1]++
# ステータスコード別統計
status_count[$9]++
# 時間別統計
time = substr($4, 2, 11)
gsub(/:/, " ", time)
split(time, t, " ")
hour_count[t[4]]++
# エラー統計
if ($9 >= 400) errors++
total++
# バイト数統計
if ($10 != "-") bytes += $10
}
END {
# Top 10 IP addresses
print "=== Top 10 IP Addresses ==="
PROCINFO["sorted_in"] = "@val_num_desc"
count = 0
for (ip in ip_count) {
if (++count > 10) break
printf "%15s: %d requests\n", ip, ip_count[ip]
}
# Status code distribution
print "\n=== Status Code Distribution ==="
for (status in status_count) {
printf "%3s: %d (%.1f%%)\n", status, status_count[status], (status_count[status]/total)*100
}
# Error rate
print "\n=== Error Analysis ==="
error_rate = (errors/total)*100
printf "Total requests: %d\n", total
printf "Errors: %d (%.2f%%)\n", errors, error_rate
# Data transfer
print "\n=== Data Transfer ==="
printf "Total bytes: %.2f MB\n", bytes/1024/1024
printf "Average per request: %.0f bytes\n", bytes/total
# Hourly distribution
print "\n=== Hourly Distribution ==="
for (h = 0; h < 24; h++) {
hour = sprintf("%02d", h)
printf "%s:00: %d requests\n", hour, hour_count[hour] + 0
}
}
' date="$date" "$log_file"
}
echo "ログ分析システムを構築中..."
プロジェクト2: データクリーニングシステム
複数のソースから収集されたCSVデータを統一フォーマットに変換し、品質チェックを行うシステムです。
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$
█
ファイルツリー
/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
データクリーニング要件
-
データ標準化
- 電話番号の統一フォーマット
- メールアドレスの検証
- 都市名の正規化
-
品質チェック
- 必須フィールドの確認
- データ型の検証
- 異常値の検出
-
エラーレポート
- 問題箇所の詳細報告
- 修正提案の生成
#!/bin/bash
# data_cleaning_system.sh
# データ品質チェックと修正
awk -F, '
BEGIN {
OFS = ","
print "=== Data Cleaning Report ==="
error_count = 0
# 都市名の正規化マップ
city_map["tokyo"] = "Tokyo"
city_map["osaka"] = "Osaka"
city_map["kyoto"] = "Kyoto"
city_map["nagoya"] = "Nagoya"
}
NR == 1 {
# ヘッダーをそのまま出力
print > "cleaned_data.csv"
next
}
{
# 各フィールドのクリーニング
name = $1
age = $2
email = $3
phone = $4
city = $5
# 名前の検証
if (name == "" || name ~ /^[[:space:]]*$/) {
print "ERROR line " NR ": Missing name"
error_count++
next
}
# 年齢の正規化
if (age == "thirty") age = 30
else if (age !~ /^[0-9]+$/) {
print "ERROR line " NR ": Invalid age: " age
error_count++
next
}
# メールアドレスの検証
if (email !~ /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/) {
print "ERROR line " NR ": Invalid email: " email
error_count++
next
}
# 電話番号の正規化
gsub(/[^0-9+]/, "", phone) # 数字と+以外を削除
if (phone ~ /^\+81/) {
phone = "(" substr(phone, 4, 3) ") " substr(phone, 7, 4) "-" substr(phone, 11)
}
# 都市名の正規化
city_lower = tolower(city)
if (city_lower in city_map) {
city = city_map[city_lower]
}
# クリーニング済みデータの出力
print name, age, email, phone, city > "cleaned_data.csv"
}
END {
print "Cleaning completed. Errors found: " error_count
if (error_count == 0) {
print "All data is clean!"
}
}' messy_data.csv
プロジェクト3: マークダウンドキュメント生成システム
テキストファイルから自動的にマークダウンドキュメントを生成するシステムです。
機能要件
-
構造解析
- 章立ての自動検出
- 目次の生成
- コードブロックの識別
-
フォーマット変換
- プレーンテキストからマークダウンへ
- 表の自動生成
- リンクの自動化
-
品質確保
- 構文チェック
- 一貫性の確認
#!/bin/bash
# markdown_generator.sh
generate_markdown() {
local input_file="$1"
local output_file="${input_file%.txt}.md"
awk '
BEGIN {
in_code = 0
chapter_count = 0
}
# 章タイトルの検出(全大文字の行)
/^[A-Z][A-Z ]+$/ {
chapter_count++
print "\n## " $0 "\n"
next
}
# コードブロックの検出
/^ / || /^\t/ {
if (!in_code) {
print "```"
in_code = 1
}
gsub(/^ /, "")
gsub(/^\t/, "")
print
next
}
# コードブロック終了
in_code && !/^ / && !/^\t/ && NF > 0 {
print "```\n"
in_code = 0
}
# 通常のテキスト処理
!in_code {
# URLの自動リンク化
gsub(/https?:\/\/[^ ]+/, "[&](&)")
# 強調の検出(*word*)
gsub(/\*([^*]+)\*/, "**\\1**")
print
}
END {
if (in_code) print "```"
print "\n---\n*Generated by markdown_generator.sh*"
}
' "$input_file" > "$output_file"
echo "Generated: $output_file"
}
最終課題: 統合テキスト処理プラットフォーム
すべての学習内容を統合した、企業レベルのテキスト処理プラットフォームを設計・実装してください。
システム要件
-
マルチソース対応
- ログファイル、CSV、JSON、XML
- リアルタイムストリーム
- バッチ処理
-
高度な分析機能
- パターン認識
- 異常検知
- トレンド分析
-
自動化とスケジューリング
- cron との連携
- エラーリカバリー
- 通知システム
-
品質保証
- テストスイート
- パフォーマンス監視
- ログ監査
プラットフォーム設計のポイント:
- モジュラー設計(各機能を独立したスクリプトに)
- 設定ファイルによる柔軟な制御
- エラーハンドリングの徹底
- パフォーマンス監視の組み込み
- ドキュメントの自動生成
コース完了
おめでとうございます!テキスト処理マスターコースを完了しました。
習得したスキル
- 正規表現の完全理解
- sed による高度なテキスト変換
- awk による本格的プログラミング
- ストリーム処理とパイプライン設計
- 自動化システムの構築
- 実践的な問題解決能力
さらなる発展
-
専門分野での応用
- ログ解析の専門化
- データサイエンスへの応用
- DevOps での活用
-
他の言語との連携
- Python/Perl との使い分け
- データベースとの連携
- Web API との統合
-
パフォーマンス最適化
- 大規模データ処理
- 並列処理の活用
- メモリ効率の改善
🎉 素晴らしい成果です!sed、awk、grep を自在に操り、複雑なテキスト処理も効率的に解決できるようになりました。学んだ技術を実際の業務で活用し、更なるスキル向上を目指してください!