find・grep・awkの使い方入門 - 正規表現の基礎から

find・grep・awkの使い方入門 - 正規表現の基礎から

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

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

この記事でわかること

  • find・grep・awk の役割の違いと、状況に応じた使い分け
  • 正規表現(BRE / ERE / PCRE)の基本記法とアンカー・量指定子
  • find による名前・サイズ・日付・権限での検索とアクション実行
  • 各コマンドを実例とともに手を動かして習得する

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

結論: find は場所探し、grep は中身探し、awk はデータ加工が得意。目的に合わせて使い分けるのが効率化の第一歩。

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

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

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

得意分野は 「どこにあるかわからないファイルを探す」

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

grep:テキスト内容検索

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

得意分野は 「ファイルの中身から特定の文字列を探す」

grep -r "ERROR" /var/log/

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

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

得意分野は 「データを加工・集計・変換する」

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

判断フロー

状況 使うコマンド
ファイルの場所がわからない find
ファイルの中身から文字列を探したい grep
データを加工・集計したい awk

正規表現マスタークラス

結論: 正規表現はアンカー・量指定子・文字クラスの組み合わせ。BRE / ERE / PCRE の違いを押さえれば3コマンドで応用できる。

正規表現(Regular Expression)は、find、grep、awk の真の力を引き出すための必須スキル。基礎から実務で即座に使えるパターンまで習得する。

正規表現の種類

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

位置指定(アンカー)

# 行頭がERRORで始まる行
grep "^ERROR" logfile.txt

# .logで終わる行
grep "\.log$" filelist.txt

# portという単語(report等は除外)
grep -E "\bport\b" config.txt

文字クラス

# 192.168.1.x のIPアドレス
grep "192\.168\.1\." access.log

# 時刻形式(HH:MM)
grep "[0-9][0-9]:[0-9][0-9]" log.txt

# 英数字以外の文字を含む行
grep "[^a-zA-Z0-9]" data.txt

量指定子(Quantifiers)

# 0回以上の繰り返し(errorとfailedが同じ行にある)
grep "error.*failed" log.txt

# 1回以上の繰り返し(ERE)
grep -E "[0-9]+" data.txt

# 0回または1回(httpまたはhttps)
grep -E "https?" urls.txt

# n回以上m回以下(2〜4桁の数字)
grep -E "[0-9]{2,4}" data.txt

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

グループ化と OR 条件:

# 複数のキーワードをOR条件で検索
grep -E "(error|warning|critical)" log.txt

先読み・後読みアサーション(PCRE):

# 「円」の前の数字だけを抽出
grep -P "\d+(?=円)" price.txt

# test.txt以外のtestを含むファイル
grep -P "test(?!\.txt)" filelist.txt

# $記号の後の数字を抽出
grep -P "(?<=\$)\d+" invoice.txt

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

ログ解析:

# IPアドレス(IPv4)
grep -E "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log

# 日時パターン(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}\]"

# 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

コード解析:

# 関数定義(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

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

正規表現のデバッグ

複雑な正規表現は 段階的に構築 すること。

# Step 1: 数字を含む行
grep "[0-9]" test.txt

# Step 2: 1つ以上の数字
grep "[0-9]\+" test.txt

# Step 3: 数字のみの行
grep "^[0-9]\+$" test.txt

-o オプションで部分マッチを確認できる:

echo "test123abc456" | grep -o "[0-9]\+"
123
456

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

  • BRE: + をエスケープ必要 → grep "192\.168\.1\.\+"
  • ERE: + はエスケープ不要 → grep -E "192\.168\.1\..+"

パフォーマンス最適化

正規表現を高速化する3つのコツ

  1. アンカーを活用: grep "^error" huge.log のほうが grep "error" huge.log より速い
  2. 不要な .* を除去: grep "error" log.txt で十分(.*error.* は遅い)
  3. 固定文字列は -F オプション: grep -F "exact_string" file.txt で正規表現エンジンを使わず高速化

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

結論: find は検索場所・検索条件・アクションの3要素で構成。名前やサイズ、日付で絞り込み一括処理まで実行できる。

find は ファイルシステムを縦横無尽に検索 できる強力なコマンド。

基本構文

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

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

名前による検索

# 拡張子が.txtのファイルを検索
find /home -name "*.txt"

# 「config」で始まるファイル
find . -name "config*"

# 大文字小文字を区別せずに.logファイルを検索
find /var -iname "*.LOG"

ファイル種別による検索

# 通常ファイルのみ
find /home -type f

# 「log」で始まるディレクトリ
find /var -type d -name "log*"

# シンボリックリンク
find /tmp -type l

サイズによる検索

# 100MB以上
find /var -size +100M

# 1KB未満
find /home -size -1k

# 1GB〜10GB
find . -size +1G -size -10G

日付・時刻による検索

# 過去7日以内に変更されたファイル(mtime)
find /home -mtime -7

# 30日以上前に変更されたファイル
find /var/log -mtime +30

# 1日以上アクセスされていないファイル(atime)
find /tmp -atime +1

# reference.txtより新しいファイル
find /home -newer reference.txt

権限・所有者による検索

# 権限が755のファイル
find /home -perm 755

# setuidビットが設定されたファイル(セキュリティチェック用)
find / -perm -4000 2>/dev/null

# www-dataユーザーが所有するファイル
find /var -user www-data

# developersグループが所有するファイル
find /home -group developers

実行アクション

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

ファイル削除:

# 一時ファイルを一括削除
find /tmp -name "*.tmp" -delete

# 30日以上古いログファイルを削除
find /var/log -name "*.log" -mtime +30 -delete

権限変更:

# PHPファイルの権限を644に変更
find /var/www -name "*.php" -exec chmod 644 {} \;

# ディレクトリの権限を755に変更
find /home -type d -exec chmod 755 {} \;

情報収集:

# txtファイルの詳細情報を表示
find /home -name "*.txt" -exec ls -lh {} \;

# 100MB以上のファイルのサイズを表示
find /var -size +100M -exec du -h {} \;

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

検索範囲を限定

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

  • 良い例: find /var/log -name "*.log"
  • 悪い例: find / -name "*.log"

権限エラーを回避

アクセス権のないディレクトリのエラーメッセージを 2>/dev/null で非表示にする。

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

効率的な条件組み合わせ

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

# 1MB以上、7日以内のログファイル
find /home -name "*.log" -size +1M -mtime -7

次のステップ

基礎編では、find/grep/awk の基本的な使い分け、正規表現の基礎、そして find コマンドの強力な検索機能について学んだ。次の応用編では、grep と awk の究極テクニックを習得する。