【 zipgrep 】コマンド――ZIPファイルの中を文字列検索するLinux基本コマンドTips(242)

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、ZIPファイルの中を文字列検索する「zipgrep」コマンドです。

» 2018年09月20日 05時00分 公開
[西村めぐみ@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はZIPファイルの中を文字列検索する「zipgrep」コマンドです。

zipgrepコマンドとは?

 「zipgrep」はZIPファイルに収納されているファイルを対象に、文字列を検索するコマンドです。ZIPファイルを作成したり、内部からファイルを取り出したりすることはできません。

 ZIPファイルの作成にはzipコマンド(連載第34回第36回第37回)を使い、ZIPファイルから元のファイルを取り出す際にはunzipコマンド(第35回第37回第38回)を使用します。

 zipgrepコマンドの検索時には、単純な文字列だけではなく、grepコマンド(第9回第10回第11回)のオプションや、「-E」オプション使用時相当の拡張正規表現を使用できます(※1)。ただし、筆者が試した限り、CentOS 7のzipgrep(unzip-6.0-13.el7.x86_64に収録)やUbuntu 18.04 LTSのzipgrep(unzip 6.0-21ubuntuに収録)では、長いオプションは使用できないようです。また、「-e」オプションの複数指定や、or検索(|記号)など一部の拡張正規表現が使用できませんでした。

※1 「-E」は拡張正規表現を使用する際のオプション。「grep -E」は「egrep」コマンドでも実行できる。





zipgrepコマンドの書式

zipgrep [オプション] 検索パターン ZIPファイル名 [対象ファイル...] [-x 除外ファイル...]

※[ ]は省略可能な引数を示しています





zipgrepの主なオプション(検索パターン関連のオプション)

短いオプション 意味
-e 検索パターン 検索パターンを指定する(※2)
-f ファイル ファイルに書かれているパターンを検索する(※2)
-i 大文字と小文字を区別しない
-w 単語全体で検索パターンと一致するものを検索する
-x 行全体が検索パターンと一致するものを検索する

※2 他のオプションと併用する場合は最後に指定する。



表示関連のオプション

短いオプション 意味
-v 検索パターンに一致しない行を表示する
-s エラーメッセージを表示しない
-q 結果を表示しない(主にシェルスクリプトなどで判定用に使う)
-L 一致するものが含まれていないファイルのファイル名のみ表示する
-l 一致するものが含まれていたファイルのファイル名のみ表示する
-c 一致するものが含まれていた回数のみ表示
-m回数 検索パターンが指定した回数に達したら処理を終了する
-o 一致した箇所だけを表示する(通常は行単位で表示)
-n 行番号を併せて表示する
-b 検索パターンがファイルの先頭から何文字目にあるかを併せて表示する
-H ファイル名を併せて表示する
-h ファイル名を表示しない(複数ファイル指定時)
-B行数 一致した行の前の行も表示する
-A行数 一致した行の後の行も表示する
-C行数, -行数 一致した行の前後の行も表示する

zipgrepで利用可能な主な正規表現

正規表現 意味 マッチする文字列
^ 行頭 ^abc abcから始まる行
$ 行末 abc$ abcで終わる行
. 改行以外の任意の1文字 a.c a7cなど
[...] 囲まれている文字のどれか [abc] abcのどれか
[^...] 囲まれている文字でない文字 [^abc] aやbやc以外
[n-n] 指定範囲のどれかの文字 [a-c] abcのどれか
* 直前文字の0回以上の繰り返し ab* aやabbbなど
+ 直前文字の1回以上の繰り返し ab+ abやabbなど
{n} 直前文字のn回の繰り返し [0-9]{3} 3桁の数値
{n,} 直前文字のn回以上の繰り返し [0-9]{3,} 3桁以上の数値
{,m} 直前文字のm回以下の繰り返し [0-9]{,5} 5桁以下の数値
{n,m} 直前文字のn回〜m回の繰り返し [0-9]{3,5} 3〜5桁の数値
() ()内をひとまとまりとする (abc){2} abcabc


ZIPファイルの中を文字列検索する

 「zipgrep 検索パターン ZIPファイル名」で、ZIPファイルに収納されているファイルを対象に、文字列を検索します。ZIPファイル名の拡張子「.zip」を省略できます(※3)。

 検索パターンが見つかった場合、「ファイル名:該当する行の内容」を表示します。バイナリファイル内の文字列に一致した場合は行の内容を示さず、「ファイル名:バイナリファイル(標準入力)に一致しました」のように表示します。

※3 省略した場合、ZIPファイルでない形式のファイルが存在するとエラーになる(例えばcompress.zipとcompressなど)。



コマンド実行例

zipgrep 検索パターン ZIPファイル名

(ZIPファイル内で検索パターンに当てはまるファイル名と該当行の内容を表示する)

zipgrep FILENAME mydata.zip

(mydata.zip内のファイルを対象に「FILENME」という文字列を検索する)


画面1 画面1 ZIPファイル内を対象に文字列「FNR」や「FILENAME」を検索したところ


対象のファイルを指定する

 「zipgrep 検索パターン ZIPファイル名 対象ファイル」で、ZIPファイル内の対象ファイルだけを検索できます。さらに「-x 除外ファイル」で除外するファイルも指定できます。「-x 除外ファイル」はZIPファイル名や対象ファイル名の後に指定しなければなりません。

 なお、ZIPファイルに収納されているファイルは、zipinfoコマンド(第241回)や、「unzip -t ZIPファイル名」で確認できます。

コマンド実行例

zipgrep 検索パターン ZIPファイル名 対象ファイル

(ZIPファイル中の対象ファイルから検索する)

zipgrep 検索パターン ZIPファイル名 -x 除外ファイル

(ZIPファイル中の除外ファイル以外から検索する)

zipgrep 検索パターン ZIPファイル名 対象ファイル -x 除外ファイル

(ZIPファイル中で除外ファイルを除き対象ファイルから検索する)

zipgrep 検索パターン ZIPファイル名 "*.txt"

(ZIPファイル内の「*.txt」ファイルから検索する)


画面2 画面2 ZIPファイルの内容を確認後、対象ファイルから検索したところ


検索結果の行だけではなく前後の行も表示する

 検索の結果見つかった行だけではなく、前後の行も表示したい場合は、「-C行数」または「-行数」を指定します。見つかった行の前の行と後ろの行を指定した行数分表示します。なお、複数行が検索パターンに該当した場合は「ファイル名:--」で区切って表示します(※4)。

 前の行数は「-B行数」、後ろの行数は「-A行数」で指定します。grepコマンドと違い、「-A」「-B」「-C」オプションの後に空白を入れることはできません。

※4 複数行が該当した場合でも表示範囲が重なった場合は「ファイル名:--」を表示しない。



コマンド実行例

zipgrep -C2 文字列 ZIPファイル名

(見つかった箇所の前後2行も併せて表示)

zipgrep -2 文字列 ZIPファイル名

(見つかった箇所の前後2行も併せて表示)


画面3 画面3 検索結果の前後の2行ずつを表示したところ


該当箇所に色を付ける

 grepコマンドを使って検索した場合、「--color」オプションを使うことで、検索パターンに該当した箇所に色を付けて表示できます。CentOSやUbuntuでは、「grep」に「grep --color=auto」というエイリアスがあらかじめ指定されています。このため、「grep 検索パターン ファイル名」で、検索結果をカラー表示します。

 zipgrepコマンドでは「--color」オプションが使えません。色付きにしたい場合は、「zipgrep 検索パターン ZIPファイル名 | grep 検索パターン」のように、検索結果をgrepコマンドに渡すとよいでしょう。

画面4 画面4 grepコマンドを併用してZIPファイル内の該当行に色を付けたところ


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。