はじめに
gzファイルはログやバックアップの保存で広く利用されていますが、通常のgrepではそのまま検索できず、初学者が戸惑いやすいポイントです。
展開してから検索する方法だけでなく、展開せずに効率よく検索する方法を知ることで、作業時間を大きく短縮できます。
本記事では、grepでgzファイルを扱うための基本から実践的な検索方法までを分かりやすく解説します。
参考: GNU grep
grepでgzファイルを検索する基本コマンド
ファイル作成
cat << 'EOF' > sample1.txt
backup data
EOF
ファイル作成
gzip -c sample1.txt > sample1.txt.gz
ファイル作成
cat << 'EOF' > sample2.txt
access log
EOF
ファイル作成
gzip -c sample2.txt > sample2.txt.gz
ファイル作成
cat << 'EOF' > sample3.txt
database dump
EOF
ファイル作成
gzip -c sample3.txt > sample3.txt.gz
実行コマンド
grep "backup" *.gz
実行結果
no output
実行コマンド
zgrep "backup" *.gz
実行結果
sample1.txt.gz:backup data
仕組み
| 項目 | 内容 |
|---|---|
| grep | 指定した文字列を検索するコマンド |
| zgrep | .gzファイルを展開せずに検索するコマンド |
| *.gz | カレントディレクトリ内のすべての.gzファイルを対象にする |
解説
通常のgrepは圧縮された.gzファイルの内容をそのまま検索できません。
.gzファイル内の文字列を検索する場合は、zgrepを使用するのが一般的です。
grepでgzファイルを展開せずに検索する方法
ファイル作成
cat << 'EOF' > input.txt
ERROR: Connection failed
INFO: Service started
ERROR: Disk full
INFO: Backup completed
EOF
ファイル作成
gzip -c input.txt > input.txt.gz
実行コマンド
zgrep "ERROR" input.txt.gz
実行結果
ERROR: Connection failed
ERROR: Disk full
実行コマンド
zgrep -n "INFO" input.txt.gz
実行結果
2:INFO: Service started
4:INFO: Backup completed
仕組み
| 項目 | 内容 |
|---|---|
| コマンド | zgrep |
| 対象 | .gz形式の圧縮ファイル |
| 展開 | 一時的に内部で展開するため、手動で解凍不要 |
| 検索処理 | grepと同じ正規表現・オプションが利用可能 |
| 用途 | 圧縮ログファイルをそのまま検索したい場合に便利 |
解説
zgrepを使用すると、gzファイルを解凍せずに直接検索できます。
ログファイルの調査や容量の大きい圧縮ファイルの検索を効率よく行えるため、運用現場でもよく利用されるコマンドです。
grepで複数のgzファイルを検索する方法
ファイル作成
mkdir -p logs
ファイル作成
echo "INFO Application started" | gzip > logs/app1.log.gz
echo "ERROR Database connection failed" | gzip > logs/app2.log.gz
echo "INFO User login" | gzip > logs/app3.log.gz
echo "ERROR Disk full" | gzip > logs/app4.log.gz
実行コマンド
zgrep "ERROR" logs/*.gz
実行結果
logs/app2.log.gz:ERROR Database connection failed
logs/app4.log.gz:ERROR Disk full
実行コマンド
zgrep -n "INFO" logs/*.gz
実行結果
logs/app1.log.gz:1:INFO Application started
logs/app3.log.gz:1:INFO User login
実行コマンド
zgrep -H "Database" logs/*.gz
実行結果
logs/app2.log.gz:ERROR Database connection failed
仕組み
| 項目 | 内容 |
|---|---|
| zgrep | gzip圧縮されたファイルを展開せずに検索できるコマンド |
| logs/*.gz | 複数のgzファイルをまとめて指定するワイルドカード |
| -n | 一致した行番号を表示する |
| -H | 検索結果にファイル名を必ず表示する |
| 検索処理 | 各gzファイルを一時的に展開し、grepと同様の検索を実行する |
解説
grepでは圧縮されたgzファイルを直接検索できないため、通常はzgrepを使用します。
logs/*.gzのようにワイルドカードを指定することで、複数のgzファイルを一括検索できます。
grepでディレクトリ内のgzファイルを再帰的に検索する方法
ファイル作成
cat << 'EOF' > file1.txt
ERROR Failed to connect database
ERROR Authentication failed
EOF
ファイル作成
gzip -c file1.txt > file1.txt.gz
ファイル作成
gzip -c file1.txt > file2.txt.gz
ファイル作成
gzip -c file1.txt > file3.txt.gz
実行コマンド
find . -type f -name "*.gz" -print0 | xargs -0 zgrep "ERROR"
実行結果
./file1.txt.gz:ERROR Failed to connect database
./file1.txt.gz:ERROR Authentication failed
./file3.txt.gz:ERROR Failed to connect database
./file3.txt.gz:ERROR Authentication failed
./file2.txt.gz:ERROR Failed to connect database
./file2.txt.gz:ERROR Authentication failed
仕組み
| 項目 | 説明 |
|---|---|
| find | 指定したディレクトリ配下を再帰的に検索する |
| -type f | 通常ファイルのみを検索対象にする |
| -name "*.gz" | 拡張子が.gzのファイルだけを抽出する |
| -print0 | ファイル名に空白が含まれていても安全に渡せる形式で出力する |
| xargs -0 | findの結果を安全にzgrepへ渡す |
| zgrep | gzipファイルを展開せずに文字列検索を行う |
解説
.gzファイルは通常のgrepでは直接検索できないため、zgrepを使用します。
findと組み合わせることで、ディレクトリ内のすべてのgzipファイルを効率よく検索できます。
grepでgzファイルと通常ファイルを同時に検索する方法
ファイル作成
cat << 'EOF' > input.txt
sample text
error: normal file
warning: normal file
EOF
ファイル作成
gzip -c input.txt > input.txt.gz
実行コマンド
grep -H "error" input.txt <(gzip -cd input.txt.gz)
実行結果
input.txt:error: normal file
/dev/fd/63:error: normal file
実行コマンド
zgrep -H "error" input.txt.gz && grep -H "error" input.txt
実行結果
input.txt.gz:error: normal file
input.txt:error: normal file
仕組み
| 方法 | 仕組み | 特徴 |
|---|---|---|
| grep <(gzip -cd file.gz) | gzip -cdでgzファイルを標準出力へ展開し、プロセス置換でgrepに渡す | grepだけで通常ファイルとgzファイルを同時に検索できる |
| zgrep + grep | zgrepがgzファイルを展開しながら検索し、通常ファイルはgrepで検索する | ファイル名を保持したまま検索結果を表示しやすい |
解説
通常ファイルとgzファイルを一度に検索したい場合は、gzip -cdをプロセス置換でgrepへ渡す方法が便利です。
ファイル名をそのまま表示したい場合は、zgrepとgrepを組み合わせる方法もよく利用されます。
grepでgzファイルを正規表現で検索する方法
ファイル作成
cat << 'EOF' > input.txt
2024-01-01 INFO Application started
2024-01-01 ERROR Database connection failed
2024-01-01 INFO Retry connection
2024-01-01 ERROR Authentication failed
2024-01-01 INFO Application stopped
EOF
ファイル作成
gzip -c input.txt > input.txt.gz
実行コマンド
grep "ERROR" <(gzip -cd input.txt.gz)
実行結果
2024-01-01 ERROR Database connection failed
2024-01-01 ERROR Authentication failed
実行コマンド
grep -E "ERROR|Retry" <(gzip -cd input.txt.gz)
実行結果
2024-01-01 ERROR Database connection failed
2024-01-01 INFO Retry connection
2024-01-01 ERROR Authentication failed
仕組み
| 項目 | 内容 |
|---|---|
| コマンド | grep |
| 対象 | プロセス置換で展開したgzファイルの内容 |
| 正規表現 | -Eオプションで拡張正規表現を利用 |
| プロセス置換 | <(gzip -cd input.txt.gz)で解凍結果を標準入力として渡す |
解説
gzip -cdでgzファイルを標準出力へ展開し、プロセス置換<(...)を使ってgrepへ渡しています。
-Eオプションを指定することで、ERROR|Retryのような複数条件の正規表現検索を実行できます。
grepでgzファイルから完全一致する文字列を検索する方法
ファイル作成
cat << 'EOF' > input.txt
error
warning
info
error
EOF
ファイル作成
gzip -c input.txt > input.txt.gz
実行コマンド
zgrep -x "error" input.txt.gz
実行結果
error
error
実行コマンド
zgrep -xc "error" input.txt.gz
実行結果
2
仕組み
| 項目 | 内容 |
|---|---|
| zgrep | gzip圧縮されたファイルを展開せずに検索するコマンド |
| -x | 行全体が検索文字列と完全一致した場合のみ表示する |
| -c | 一致した行数のみを表示する |
| input.txt.gz | 検索対象のgzip圧縮ファイル |
解説
zgrepは内部でgzipファイルを展開しながらgrepを実行するため、一時展開する必要がありません。
-xを指定すると、行全体が検索文字列と一致する場合のみヒットします。
grepでgzファイル内の複数キーワードを検索する方法
ファイル作成
cat << 'EOF' > input.txt
INFO Start application
ERROR Database connection failed
WARN Retry connection
INFO User login
ERROR Timeout occurred
WARN Disk usage high
EOF
ファイル作成
gzip -c input.txt > input.txt.gz
実行コマンド
zgrep -E 'ERROR|WARN' input.txt.gz
実行結果
ERROR Database connection failed
WARN Retry connection
ERROR Timeout occurred
WARN Disk usage high
実行コマンド
gzip -cd input.txt.gz | grep -E 'ERROR|WARN'
実行結果
ERROR Database connection failed
WARN Retry connection
ERROR Timeout occurred
WARN Disk usage high
仕組み
| 項目 | 内容 |
|---|---|
| zgrep | gzip圧縮されたファイルを展開しながら検索するコマンド |
| -E | 拡張正規表現を使用し、ERROR|WARN のような複数キーワードを指定できる |
| | | OR条件を表し、いずれかのキーワードに一致した行を検索する |
| gzip -cd | gzファイルを標準出力へ展開する |
| grep -E | 展開された内容に対して複数キーワードを検索する |
解説
grepではgzファイルを直接検索できないため、zgrepまたはgzip -cdとパイプを組み合わせる方法を利用します。
複数キーワードはgrep -E 'キーワード1|キーワード2'の形式で指定できます。
grepでgzファイル内の一致件数を確認する方法
ファイル作成
cat << 'EOF' > input.txt
INFO Start
ERROR Connection failed
INFO Retry
ERROR Timeout
INFO End
EOF
ファイル作成
gzip -c input.txt > input.txt.gz
実行コマンド
zgrep -c "ERROR" input.txt.gz
実行結果
2
実行コマンド
zgrep "ERROR" input.txt.gz | wc -l
実行結果
2
実行コマンド
gzip -cd input.txt.gz | grep -c "ERROR"
実行結果
2
仕組み
| コマンド | 仕組み | 用途 |
|---|---|---|
| zgrep -c "ERROR" input.txt.gz | gzip圧縮ファイルを展開しながら検索し、一致件数のみを表示する | 一致件数を素早く確認したい場合 |
| zgrep "ERROR" input.txt.gz | wc -l | zgrepで一致した行を出力し、その行数をwc -lで数える | 一致した内容も確認しながら件数を数えたい場合 |
| gzip -cd input.txt.gz | grep -c "ERROR" | gzip -cdで標準出力へ展開し、その出力をgrep -cへパイプして一致件数を数える | zgrepが利用できない環境や、展開後のデータを他のコマンドへ渡したい場合 |
解説
gzファイル内の文字列を検索するには、zgrepを使用する方法と、gzip -cdで展開した内容をgrepへ渡す方法があります。件数のみを確認する場合は、どちらも-cオプションを利用することで簡単に一致件数を取得できます。
grepでgzファイルの前後の行も表示する方法
ファイル作成
cat << 'EOF' > input.txt
2024-01-01 INFO Application Start
2024-01-01 INFO Loading config
2024-01-01 ERROR Database connection failed
2024-01-01 INFO Retry connection
2024-01-01 INFO Database connection success
EOF
ファイル作成
gzip -c input.txt > input.txt.gz
実行コマンド
grep -C 1 "ERROR" <(gzip -cd input.txt.gz)
実行結果
2024-01-01 INFO Loading config
2024-01-01 ERROR Database connection failed
2024-01-01 INFO Retry connection
仕組み
| 項目 | 内容 |
|---|---|
| gzip -cd | gzファイルを標準出力へ展開する (-c は標準出力、-d は展開) |
| <(...) | プロセス置換により、展開結果を一時的なファイルのように grep へ渡す |
| grep -C 1 | 一致した行の前後1行を表示する |
| "ERROR" | 検索する文字列 |
| input.txt.gz | 検索対象のgzファイル |
解説
gzip -cdでgzファイルを標準出力へ展開し、その出力をプロセス置換<(...)でgrepへ渡しています。
これにより、ファイルを展開せずに通常のgrepコマンドで前後の行を含めた検索ができます。
grepでfindコマンドと組み合わせてgzファイルを検索する方法
ファイル作成
mkdir -p logs/app logs/archive
ファイル作成
echo "INFO: start" > logs/app/app.log
ファイル作成
echo "ERROR: disk full" > logs/app/error.log
ファイル作成
gzip logs/app/error.log
ファイル作成
echo "INFO: backup" > logs/archive/backup.log
ファイル作成
gzip logs/archive/backup.log
実行コマンド
find logs -name "*.gz"
実行結果
logs/app/error.log.gz
logs/archive/backup.log.gz
実行コマンド
find logs -name "*.gz" | grep "error"
実行結果
logs/app/error.log.gz
仕組み
| 仕組み | 内容 |
|---|---|
| find logs | logsディレクトリ配下を再帰的に検索する |
| -name "*.gz" | 拡張子が.gzのファイルだけを対象にする |
| | | findの検索結果をgrepへ渡す |
| grep "error" | パス名にerrorを含む.gzファイルだけを抽出する |
解説
findで.gzファイルを検索し、その結果をgrepへ渡すことで目的のファイルだけを効率よく絞り込めます。
大量の.gzファイルがある環境でも必要なファイルを素早く検索できます。
grepでログローテートされたgzファイルを検索する方法
ファイル作成
cat << 'EOF' > input.txt
2025-07-01 10:00:01 INFO Application started
2025-07-01 10:01:15 ERROR Database connection failed
2025-07-01 10:02:30 INFO Retry database connection
2025-07-01 10:03:12 ERROR Timeout occurred
EOF
ファイル作成
gzip -c input.txt > input.txt.gz
実行コマンド
zgrep "ERROR" input.txt.gz
実行結果
2025-07-01 10:01:15 ERROR Database connection failed
2025-07-01 10:03:12 ERROR Timeout occurred
実行コマンド
zgrep -n "ERROR" input.txt.gz
実行結果
2:2025-07-01 10:01:15 ERROR Database connection failed
4:2025-07-01 10:03:12 ERROR Timeout occurred
実行コマンド
zgrep -i "error" input.txt.gz
実行結果
2025-07-01 10:01:15 ERROR Database connection failed
2025-07-01 10:03:12 ERROR Timeout occurred
仕組み
| 項目 | 内容 |
|---|---|
| zgrep | gzip形式(.gz)の圧縮ファイルを展開せずに検索するコマンド |
| "ERROR" | 検索する文字列を指定 |
| -n | 一致した行番号を表示 |
| -i | 大文字・小文字を区別せず検索 |
| input.txt.gz | ログローテートされたgzip圧縮ログファイル |
解説
zgrepを利用すると、ログローテートされた.gzファイルを解凍することなくgrepと同じ感覚で検索できます。
障害調査や過去ログの確認を効率よく行えるため、運用現場でよく利用されます。
grepで大量のgzファイルを高速に検索する方法
ファイル作成
mkdir -p logs
ファイル作成
cat << 'LOG' > logs/app1.log
INFO Application started
ERROR Database connection failed
INFO Retry completed
LOG
ファイル作成
cat << 'LOG' > logs/app2.log
INFO User login
ERROR Timeout occurred
INFO Process finished
LOG
ファイル作成
gzip -f logs/app1.log
ファイル作成
gzip -f logs/app2.log
実行コマンド
zgrep "ERROR" logs/app1.log.gz
実行結果
ERROR Database connection failed
実行コマンド
find logs -name "*.gz" -exec zgrep -H "ERROR" {} +
実行結果
logs/app1.log.gz:ERROR Database connection failed
logs/app2.log.gz:ERROR Timeout occurred
仕組み
| 仕組み | 内容 |
|---|---|
| zgrep | gzip圧縮されたファイルを展開せずにgrep検索する。 |
| find | 大量の.gzファイルを検索対象として列挙する。 |
| -H | 一致したファイル名も同時に表示する。 |
| -exec {} + | 複数ファイルをまとめてzgrepへ渡し、プロセス生成回数を削減する。 |
解説
grep gz ファイルを検索する場合は、通常のgrepではなくzgrepを使用すると、gzipファイルを展開せずに直接検索できます。
大量のgzファイルではfindと-exec {} +を組み合わせることで、効率よく一括検索できます。
grepでgzファイル検索時によくあるエラーと対処法
ファイル作成
cat << 'EOF' > input.txt
INFO Start application
ERROR Database connection failed
INFO Retry
EOF
ファイル作成
gzip -c input.txt > input.txt.gz
実行コマンド
grep "ERROR" input.txt.gz
実行結果
no output
実行コマンド
zgrep "ERROR" input.txt.gz
実行結果
ERROR Database connection failed
実行コマンド
gzip -cd input.txt.gz | grep "ERROR"
実行結果
ERROR Database connection failed
仕組み
| コマンド | 仕組み |
|---|---|
| grep "ERROR" input.txt.gz | gzip圧縮されたバイナリデータをそのまま検索するため、テキストとして正しく検索できません。 |
| zgrep "ERROR" input.txt.gz | 内部で.gzファイルを展開しながらgrepを実行するため、圧縮ファイルを直接検索できます。 |
| gzip -cd input.txt.gz | grep "ERROR" | gzip -cdで標準出力へ解凍した内容をパイプでgrepへ渡して検索します。 |
解説
grepは圧縮された.gzファイルの内容を直接検索できないため、Binary file ... matchesなどのメッセージが表示されることがあります。
.gzファイルを検索する場合はzgrep、またはgzip -cdで解凍してからgrepへ渡す方法を使用します。
grepでgzファイルを検索する方法のポイントまとめ
grepでgzファイルを扱うには、zgrepなどの関連コマンドを活用すると展開せずに検索できます。
効率よく目的のデータを見つけられるように各見出しのコマンドをご活用ください
