圧縮ファイルを直接検索!zgrep, zegrep, zfgrepを使いこなそう

記事内に広告が含まれています。

Linuxで作業していると、ディスク容量を節約するために圧縮されたログファイルやデータファイルを扱う場面によく出くわしますよね。

これらのファイルの中身を検索したいとき、いちいち解凍するのは手間です。

そんな時に役立つのが、以下のコマンドたちです。

  • zgrep
  • zegrep
  • zfgrep

これらのコマンドは、「grep」「egrep」「fgrep」と非常によく似たおなじみのgrep、egrep、fgrepと非常によく似た働きをします。

大きな違いは、「.gz」や「.Z」といった拡張子を持つ圧縮ファイルに対して解凍せずに直接検索を実行できる点です。

この記事では、それぞれのコマンドがどのような役割を持ち、どんな場面で使い分けるべきかを解説します。

zgrep: 基本的な正規表現で検索

zgrepは、通常のgrepと同じように動作し、検索パターンを「基本的な正規表現」として解釈します。

基本的な正規表現では、「^」(行頭)、「$」(行末)、「*」(直前の文字の0回以上の繰り返し)などのメタ文字を使用できます。

使用例

/var/log/nginx/access.log-20250701.gz から "GET /index.html" を含む行を検索してみましょう。

# zgrep "GET /index.html" /var/log/nginx/access.log-20250701.gz
xxx.xxx.xxx.xxx - - [30/Jun/2025:13:30:47 +0900] "GET /index.html HTTP/1.1" 200 615 "-" "'Mozilla/5.0 (compatible; GenomeCrawlerd/1.0; +https://www.nokia.com/genomecrawler)'" "-"

zegrep: 拡張正規表現で、より複雑な検索を

「zegrep」は「egrep」(grep -Eと同等)のように動作し、「拡張正規表現」をサポートします。

拡張正規表現では、「+」(直前の文字の1回以上の繰り返し)、「?」(直前の文字の0回または1回の繰り返し)、「|」(OR条件)など、より多くのメタ文字が使えます。

これにより、より複雑で柔軟な検索パターンを記述することができます。

使用例

/var/log/nginx/error.log-20250701.gz から「error」または「warning」を含む行を検索してみましょう。

# zegrep "error|warning" /var/log/nginx/error.log-20250701.gz | head -3
2025/06/30 00:05:07 [error] 697#697: *17442 open() "/usr/share/nginx/html/portal/redlion" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: localhost, request: "GET /portal/redlion HTTP/1.1", host: "xxx.xxx.xxx.xxx"
2025/06/30 00:47:34 [error] 695#695: *17449 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "xxx.xxx.xxx.xxx", referrer: "http://49.212.167.248/"
2025/06/30 01:33:50 [error] 695#695: *17455 open() "/usr/share/nginx/html/.env" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: localhost, request: "GET /.env HTTP/1.1", host: "xxx.xxx.xxx.xxx"

zfgrep: 固定文字列で、最速の検索

「zfgrep」は「fgrep」(grep -Fと同等)のように動作し、検索パターンを正規表現として解釈せず、「固定文字列(fixed string)」として扱います。

「*」や「?`」などのメタ文字を単なる文字として検索されます。

正規表現の解釈が不要なため、特定の文字列をそのまま検索したい場合に非常に高速に処理できます。

使用例

/var/log/nginx/access.log-20250630.gz から "133.242.16.216" という文字列を完全に一致で検索してみましょう。

# zfgrep "133.242.16.216" /var/log/nginx/access.log-20250630.gz 
xxx.xxx.xxx.xxx - - [29/Jun/2025:22:21:03 +0900] "GET / HTTP/1.1" 200 11 "http://133.242.16.216:80/" "-" "-"

コメント

タイトルとURLをコピーしました