find/grep/awk基礎編
コマンドの概要と正規表現マスタークラス

基本的なLinuxコマンドに慣れてきたら、次に覚えるべきはfind、grep、awkの3つです。これらはLinuxでのファイル操作において非常に強力で、習得すると業務効率が大幅に向上します。

この基礎編では、3つのコマンドの概要と使い分け、そして全てのコマンドで活用できる正規表現の完全マスター、さらにfindコマンドの強力な検索機能について、実例とともに詳しく解説します。

📊 この記事で習得できるスキル

コマンドの使い分け
正規表現マスター
findコマンド活用

📋 目次

  1. 3つのコマンドの概要と使い分け
  2. 🎭 正規表現マスタークラス
  3. findコマンド:ファイル検索の極意

1. 3つのコマンドの概要と使い分け

まず、各コマンドの特徴と用途を理解しましょう。適切なコマンドを選ぶことが、効率的な作業の第一歩です。

🔍 find

ファイル・ディレクトリ検索

主な用途

  • 名前でファイルを検索
  • サイズ・日付での絞り込み
  • 権限・所有者での検索
  • 見つけたファイルに対する一括処理

得意分野

「どこにあるかわからないファイルを探す」

find /home -name "*.txt" -size +1M

1MB以上のtxtファイルを検索

🔎 grep

テキスト内容検索

主な用途

  • ファイル内のテキスト検索
  • 正規表現を使った高度な検索
  • ログファイルの解析
  • 設定ファイルの確認

得意分野

「ファイルの中身から特定の文字列を探す」

grep -r "ERROR" /var/log/

ログディレクトリからERRORを検索

⚙️ awk

テキスト処理・データ加工

主な用途

  • 列データの抽出・計算
  • CSVファイルの処理
  • ログファイルの集計
  • フォーマット変換

得意分野

「データを加工・集計・変換する」

awk '{sum+=$3} END {print sum}' sales.csv

CSVの3列目を合計

🎯 どのコマンドを使うべき?判断フローチャート

📁 ファイルの場所がわからない?
YES → findを使う
NO ↓
📝 ファイルの中身から文字列を探したい?
YES → grepを使う
NO ↓
📊 データを加工・集計したい?
YES → awkを使う

2. 🎭 正規表現マスタークラス

正規表現(Regular Expression)は、find、grep、awkの真の力を引き出すための必須スキルです。この章では、基礎から高度なパターンマッチングまで、実務で即座に使える正規表現を完全マスターします。

🔤 正規表現の基礎から応用まで

📊 正規表現の種類と対応ツール

種類 略称 対応ツール 特徴
基本正規表現 BRE grep, sed, vi メタ文字をエスケープ必要
拡張正規表現 ERE egrep, grep -E, awk より直感的な記法
Perl互換正規表現 PCRE grep -P, perl, python 最も高機能(先読み・後読み対応)

🔰 基本メタ文字の完全理解

位置指定(アンカー)
^ : 行の先頭
grep "^ERROR" logfile.txt 行頭がERRORで始まる行
$ : 行の末尾
grep "\.log$" filelist.txt .logで終わる行
\b : 単語境界
grep -E "\bport\b" config.txt portという単語(report等は除外)
文字クラス
. : 任意の1文字(改行以外)
grep "192\.168\.1\." access.log 192.168.1.x のIPアドレス
[abc] : 文字クラス(a,b,cのいずれか)
grep "[0-9][0-9]:[0-9][0-9]" log.txt 時刻形式(HH:MM)
[^abc] : 否定文字クラス
grep "[^a-zA-Z0-9]" data.txt 英数字以外の文字を含む行
量指定子(Quantifiers)
* : 0回以上の繰り返し
grep "error.*failed" log.txt errorとfailedが同じ行にある
+ : 1回以上の繰り返し(ERE)
grep -E "[0-9]+" data.txt 1つ以上の数字
? : 0回または1回(ERE)
grep -E "https?" urls.txt httpまたはhttps
{n,m} : n回以上m回以下(ERE)
grep -E "[0-9]{2,4}" data.txt 2~4桁の数字

🚀 高度なパターンマッチング

グループ化と後方参照
基本的なグループ化
grep -E "(error|warning|critical)" log.txt

複数のキーワードをOR条件で検索

後方参照(Back Reference)
grep -E "([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})" access.log

IPアドレスの各オクテットをグループ化

awkでの活用例:

awk 'match($0, /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/, arr) { if (arr[1] == 192 && arr[2] == 168) print "Private IP: " $0 }'
最短マッチと最長マッチ
貪欲(Greedy)マッチ - デフォルト
echo "<tag>content</tag> <tag>more</tag>" | grep -o "<.*>"

結果: <tag>content</tag> <tag>more</tag>

非貪欲(Non-greedy)マッチ - PCRE
echo "<tag>content</tag> <tag>more</tag>" | grep -oP "<.*?>"

結果: <tag> </tag> <tag> </tag>

先読み・後読みアサーション(PCRE)
肯定先読み (?=pattern)
grep -P "\d+(?=円)" price.txt

「円」の前の数字だけを抽出

否定先読み (?!pattern)
grep -P "test(?!\.txt)" filelist.txt

test.txt以外のtestを含むファイル

肯定後読み (?<=pattern)
grep -P "(?<=\$)\d+" invoice.txt

$記号の後の数字を抽出

💼 実務で使える正規表現パターン集

🔍 ログ解析パターン
IPアドレス(IPv4)
grep -E "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log

厳密版(0-255の範囲チェック):

grep -E "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
日時パターン(Apache形式)
grep -E "\[[0-9]{2}/[A-Z][a-z]{2}/[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2} [+-][0-9]{4}\]"

例: [14/Sep/2025:10:30:45 +0900]

HTTPステータスコード
grep -E "\" [1-5][0-9]{2} " access.log | awk '{print $(NF-1)}' | sort | uniq -c

ステータスコード別の集計

エラーレベル抽出
grep -E "\b(DEBUG|INFO|WARN|ERROR|FATAL|CRITICAL)\b" app.log
📧 データ検証パターン
メールアドレス(簡易版)
grep -E "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"
URL(http/https)
grep -E "https?://[^\s\"']+" webdata.txt
電話番号(日本)
grep -E "(0[0-9]{1,4}-?[0-9]{1,4}-?[0-9]{4})" contacts.txt

例: 03-1234-5678, 090-1234-5678, 0312345678

クレジットカード番号のマスキング
sed -E 's/\b([0-9]{4})[- ]?([0-9]{4})[- ]?([0-9]{4})[- ]?([0-9]{4})\b/\1-XXXX-XXXX-\4/g'

最初と最後の4桁以外をマスク

💻 コード解析パターン
関数定義(JavaScript/Python)
grep -E "^(function|def)\s+[a-zA-Z_][a-zA-Z0-9_]*\s*\(" *.js *.py
変数宣言(JavaScript)
grep -E "^(var|let|const)\s+[a-zA-Z_][a-zA-Z0-9_]*" *.js
コメント抽出
grep -E "(//.*$|/\*.*\*/)" code.js

単一行・複数行コメント

TODO/FIXME コメント
grep -E "(TODO|FIXME|XXX|HACK|NOTE):" -n *.py

🔧 正規表現のデバッグとテスト

デバッグテクニック
1. 段階的構築

複雑な正規表現は段階的に構築:

Step 1: grep "[0-9]" test.txt 数字を含む行
Step 2: grep "[0-9]\+" test.txt 1つ以上の数字
Step 3: grep "^[0-9]\+$" test.txt 数字のみの行
2. -o オプションで部分マッチ確認
echo "test123abc456" | grep -o "[0-9]\+"

123
456

3. エスケープの確認

BREとEREでのエスケープの違い:

# BRE (基本正規表現) grep "192\.168\.1\.\+" access.log # + をエスケープ # ERE (拡張正規表現) grep -E "192\.168\.1\..+" access.log # + はエスケープ不要

⚡ 正規表現のパフォーマンス最適化

1. アンカーを活用
❌ 遅い: grep "error" huge.log
✅ 速い: grep "^error" huge.log

行頭アンカーで検索範囲を限定

2. 文字クラスを最小化
❌ 遅い: grep ".*error.*" log.txt
✅ 速い: grep "error" log.txt

不要な .* を除去

3. 固定文字列は -F オプション
grep -F "exact_string" file.txt

正規表現エンジンを使わないため高速

3. findコマンド:ファイル検索の極意

findはファイルシステムを縦横無尽に検索できる強力なコマンドです。基本構文から高度な応用まで、段階的に学習しましょう。

🔧 基本構文

find [検索場所] [検索条件] [アクション]

検索場所で検索条件に合うファイルを見つけ、アクションを実行

📁 基本的な検索パターン

名前による検索

find /home -name "*.txt"

拡張子が.txtのファイルを検索

find . -name "config*"

現在ディレクトリ以下で「config」で始まるファイル

find /var -iname "*.LOG"

大文字小文字を区別せずに.logファイルを検索

ファイル種別による検索

find /home -type f

通常ファイルのみを検索

find /var -type d -name "log*"

「log」で始まるディレクトリを検索

find /tmp -type l

シンボリックリンクを検索

サイズによる検索

find /var -size +100M

100MB以上のファイルを検索

find /home -size -1k

1KB未満のファイルを検索

find . -size +1G -size -10G

1GB〜10GBのファイルを検索

📅 日付・時刻による検索

🔐 権限・所有者による検索

⚡ 実行アクション

findの真の力は、見つけたファイルに対して自動で処理を実行できることです。

🗑️ ファイル削除

find /tmp -name "*.tmp" -delete

一時ファイルを一括削除

find /var/log -name "*.log" -mtime +30 -delete

30日以上古いログファイルを削除

🔧 権限変更

find /var/www -name "*.php" -exec chmod 644 {} \;

PHPファイルの権限を644に変更

find /home -type d -exec chmod 755 {} \;

ディレクトリの権限を755に変更

📋 情報収集

find /home -name "*.txt" -exec ls -lh {} \;

txtファイルの詳細情報を表示

find /var -size +100M -exec du -h {} \;

100MB以上のファイルのサイズを表示

💡 findコマンドのベストプラクティス

🎯 検索範囲を限定

ルートディレクトリ(/)から検索すると時間がかかるため、できるだけ具体的なディレクトリを指定

find /var/log -name "*.log"
find / -name "*.log"

🚫 権限エラーを回避

アクセス権のないディレクトリのエラーメッセージを非表示にする

find / -name "*.txt" 2>/dev/null

⚡ 効率的な条件組み合わせ

複数条件を組み合わせて精密に検索

find /home -name "*.log" -size +1M -mtime -7

1MB以上、7日以内のログファイル

🎯 次のステップ

基礎編では、find/grep/awkの基本的な使い分け、正規表現の完全マスター、そしてfindコマンドの強力な検索機能について学びました。

次の応用編では、grepとawkの究極テクニックを習得し、より高度なテキスト処理とデータ加工のスキルを身につけます。