「まだgrep→awk→jq→pandas使い分けてるの?」hawk v0.2.1で統一された話
また新しいツール覚えなきゃ...
「ログ解析はgrep、JSONはjq、統計はpandas、文字列処理はawk...」
インフラエンジニアの机の上には、用途別のコマンドチートシートが散乱。毎回「あのコマンド何だっけ?」でググっている日々。
そんな 「ツール使い分け地獄」 を、hawk v0.2.1 で終わらせました。
前回の記事(120+ likes!)で大きな反響をいただいたhawkが、この度v0.2.1として大幅にパワーアップ。ついに 「一つのツールで全部できる」 世界が実現しました。
- 🆕 テキストファイル対応: ログ解析が可能に
- 🧵 文字列操作: 10種類以上の文字列関数を追加
- 📊 統計機能: median, stddev, unique, sort対応
- 🎨 カラー出力: 見やすい色付き表示
- 🔧 後方互換性: 既存のクエリはそのまま動作
日常業務の「あるある」な悩み
パターン1: ログ解析での工具箱あさり
# エラーログを探す
grep "ERROR" app.log
# 時間で絞り込む
grep "2024-01-15 09" app.log | grep "ERROR"
# 重複を除去
grep "ERROR" app.log | sort | uniq
# 件数をカウント
grep "ERROR" app.log | wc -l
4つのコマンドを駆使して、やっと欲しい情報にたどり着く日々。
パターン2: データ形式ごとのツール切り替え
# JSONの場合
jq '.users[] | select(.age > 30)' data.json
# CSVの場合
awk -F',' '$2 > 30 {print $0}' data.csv
# YAMLの場合
yq '.users[] | select(.age > 30)' data.yaml
同じことをしたいのに、形式が違うだけで別ツール。そして毎回構文を調べ直し...
パターン3: 統計処理での重装備
# ちょっとした平均値計算のために...
import pandas as pd
df = pd.read_csv('data.csv')
print(df['value'].mean())
「ちょっと平均値が知りたいだけ」なのに、Pythonスクリプト作成から始まる無駄な時間。
hawk v0.2.1で実現した「統一された世界」
すべてのデータ処理が一つのコマンドに
Before: ツール使い分け地獄
# ログ解析
grep "ERROR" app.log | sort | uniq -c
# JSON処理
jq '.users[] | select(.age > 30)' data.json
# CSV統計
awk -F',' '{sum+=$3} END {print sum/NR}' data.csv
# 文字列処理
sed 's/_/-/g' filenames.txt
After: hawkで統一
# ログ解析
hawk '. | select(. | contains("ERROR")) | count' app.log
# JSON処理(同じ構文!)
hawk '.users[] | select(.age > 30)' data.json
# CSV統計(同じ構文!)
hawk '.[] | avg(.price)' data.csv
# 文字列処理(同じ構文!)
hawk '. | map(. | replace("_", "-"))' filenames.txt
一つの構文ですべてに対応。これが長年の夢だった「統一インターフェース」です。
新機能1: ついにテキストファイル対応
これまでの悩み: 「hawkは構造化データ(JSON, YAML, CSV)しか使えない、ログファイルはgrepのまま...」
v0.2.1で解決:
# アプリケーションログからエラー行を抽出
hawk '. | select(. | contains("ERROR"))' app.log
# → 2024-01-15 09:01:23 ERROR Failed to process user request: connection timeout
# メールサーバーの認証失敗検知
hawk '. | select(. | contains("authentication failed"))' mail.log
# → Jan 15 09:01:24 mailserver postfix/smtpd[12347]: warning: unknown[203.0.113.1]: SASL login authentication failed
ログファイルもhawkの世界に統合完了。もうgrepとの使い分けで悩まない。
新機能2: 直感的な文字列操作
これまでの悩み: 「sedやawkの正規表現、毎回調べるのめんどくさい...」
v0.2.0で解決:
# 大文字変換(sedの複雑な構文とサヨナラ)
hawk '. | map(. | upper)' names.txt
# 空白除去 + 小文字変換(パイプラインで直感的)
hawk '. | map(. | trim | lower)' emails.txt
# 文字列置換(正規表現不要)
hawk '. | map(. | replace("_", "-"))' filenames.txt
pandas風の直感的な操作で、文字列処理のストレスから解放。
新機能3: 統計処理の簡素化
これまでの悩み: 「平均値ひとつ出すのにPythonスクリプト...」
v0.2.0で解決:
# 中央値(Pythonスクリプト不要)
hawk '.[] | median(.price)' sales.csv
# 標準偏差(統計ライブラリ不要)
hawk '.[] | stddev(.temperature)' sensor_data.csv
# 重複除去 + ソート(複数コマンド不要)
hawk '.[] | unique(.category) | sort' products.json
統計処理も同じ構文で。データサイエンスが日常に。
新機能4: 見やすさの革命
これまでの悩み: 「ターミナルの出力、見づらくて目が疲れる...」
v0.2.0で解決:
- テーブルヘッダー: 青色 + 太字で一目瞭然
- 数値: 緑色で数字が際立つ
- 真偽値: 黄色でステータス確認が楽
- 自動検知: パイプ時は自動的にプレーン出力
もはや「美しいCLI」の時代到来。
実感できる効果:日常業務がこう変わった
ログ監視業務の変化
Before: コマンド4連発
grep "ERROR" app.log # 1. エラー抽出
grep "09:01" app.log # 2. 時間絞り込み
sort error_logs.txt # 3. ソート
uniq -c sorted_errors.txt # 4. 重複カウント
After: ワンライナー
hawk '. | select(. | contains("ERROR")) | select(. | contains("09:01"))' app.log
効果: 作業時間 5分 → 30秒 に短縮
データ分析業務の変化
Before: Python起動地獄
# ちょっとした統計のために...
import pandas as pd
df = pd.read_csv('sales.csv')
print(df.groupby('region').price.median())
After: CLI一発
hawk '.[] | group_by(.region) | median(.price)' sales.csv
効果: セットアップ時間 3分 → 0秒 に短縮
ファイル処理業務の変化
Before: ツール切り替え祭り
# JSON → jq
jq '.users[] | select(.age > 30)' users.json
# CSV → awk
awk -F',' '$2 > 30' users.csv
# YAML → yq
yq '.users[] | select(.age > 30)' users.yaml
After: 統一構文
# すべて同じ書き方
hawk '.users[] | select(.age > 30)' users.json
hawk '.[] | select(.age > 30)' users.csv
hawk '.users[] | select(.age > 30)' users.yaml
効果: 学習コスト 80%削減、構文忘れによるググり 90%削減
DevOpsでのログ解析
# 1. アプリケーションエラーの監視
hawk '. | select(. | contains("ERROR"))' app.log
# 2. メールサーバーの認証失敗検知
hawk '. | select(. | contains("authentication failed"))' mail.log
# 3. Webサーバーのエラーレスポンス統計
hawk '. | select(. | contains(" 500 ")) | count' nginx.log
データクリーニングの自動化
# 1. ユーザーデータの正規化
hawk '.[] | map(.customer_email | lower | trim)' sales.csv
# 2. Kubernetesマニフェストの構造確認
hawk '. | info' deployment.yaml
# 3. ログファイルからの重要情報抽出
hawk '. | select(. | contains("memory"))' app.log
# → 2024-01-15 09:02:45 WARN High memory usage detected: 85%
パフォーマンスと安定性の向上
メモリ効率の改善
- 大容量ファイル処理の最適化
- ストリーミング処理による省メモリ化
エラーハンドリングの強化
# より詳細なエラーメッセージ
hawk '.users[].invalid_field' data.json
# Error: Field 'invalid_field' not found in object at .users[0]
起動時間の短縮
- 依存関係の最適化
- 初期化処理の高速化
後方互換性の維持
重要: v0.1.0のクエリはすべてそのまま動作します
# v0.1.0と同じ書き方がそのまま使える
hawk '.users[] | select(.age > 30) | group_by(.department) | count' data.json
実装の舞台裏
技術的な挑戦
テキスト処理の統一:
// 全形式を統一的に扱う設計
match format {
FileFormat::Json => parse_json(content),
FileFormat::Yaml => parse_yaml(content),
FileFormat::Csv => parse_csv(content),
FileFormat::Text => parse_text_as_array(content), // NEW!
}
文字列操作のパイプライン:
// 複雑な文字列変換も型安全に
.map(|s| s.trim().to_uppercase().replace("_", " "))
pandas風の追求
今回のアップデートの多くは、「pandas風の操作感をより忠実に再現したい」という個人的な思いから生まれました:
-
文字列操作: pandasの
.strアクセサのような直感的な文字列処理 -
統計関数:
median(),std()などの基本統計関数 -
データクリーニング:
unique(),sort()によるデータ整理 - 視認性: Jupyter notebookのような見やすい出力
コミュニティ参加
現在、以下のような貢献を募集中:
- 📖 ドキュメント改善: 使用例の追加
- 🐛 バグ報告: エッジケースの発見
- 💡 機能提案: 新しいユースケースの提案
- 🔧 コード貢献: 新機能の実装
試してみよう
インストール
# Homebrew (推奨)
brew install kyotalab/tools/hawk
# Cargo
cargo install hawk-data
# バージョン確認
hawk --version # hawk 0.2.1
今すぐ試してみる
# インストール
brew install kyotalab/tools/hawk
# サンプルデータで即体験
cat << 'EOF' > sample.log
2024-01-15 09:00:01 INFO Application started
2024-01-15 09:01:23 ERROR Connection failed
2024-01-15 09:02:45 WARN High memory usage
EOF
# エラーログの抽出(grep不要)
hawk '. | select(. | contains("ERROR"))' sample.log
# JSONでも同じ構文
cat << 'EOF' | hawk '.users[] | select(.age > 25)'
{
"users": [
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25}
]
}
EOF
一度使ったら、もう使い分けの世界には戻れません。
おわりに:「もう使い分けに戻れない」
hawk v0.2.1を使い始めてから、データ処理に対する考え方が根本的に変わりました。
「このデータ、どのツールで処理すれば...」 という悩みがなくなり、
「hawkでどう書けば...」 という思考に統一された。
これまでツール習得に費やしていた時間を、本来の業務や新しい技術学習に使えるようになったのが最大の収穫です。
前回記事での皆様の反響が、開発継続の大きなモチベーションになりました。引き続き、日常の業務を少しでも楽にするツールとして育てていきたいと思います。
引き続き、日常の業務を少しでも楽にするツールとして育てていきたいと思います。
より多くの例を試したい場合
# GitHubからサンプルデータをダウンロード
git clone https://github.com/kyotalab/hawk.git
cd hawk/examples
# 様々なファイル形式を試せる
hawk '. | select(. | contains("ERROR"))' app.log
hawk '. | info' deployment.yaml
hawk '.[] | group_by(.region) | count' sales.csv
または、examples ディレクトリから個別にダウンロードも可能です。
Links
📝 v0.2.1で追加された機能、どれか気になるものはありましたか?
💖 この記事が役に立ちましたら、いいねをお願いします。
Discussion