1. 概要

grep コマンドを使用して、ファイル内の特定の文字パターンの検索をフィルタリングします。 テキスト検索パターンは正規表現と呼ばれます。 これは、検索しようとしているパターンを含む行を表示するために最もよく使用されるLinuxコマンドの1つです。

grep ツールを使用している場合、時間を節約するためにバイナリファイルのスキャンを避けたい場合があります。 これは、実際の実際のバイナリファイルだけでなく、特定のテキストファイルにも関連する場合があります。

この短いチュートリアルでは、 grep を使用する方法と、検索からバイナリを除外する方法を見ていきます。

2. バイナリファイルがgrepで問題になる理由

grepがファイルをバイナリと見なす場合が2つあります。 エンコーディングエラーとNULバイト。 それらをもう少し詳しく見ていきましょう。

2.1. エンコーディングエラー

grep ツールは、C99 mbrlen 関数によるエンコードエラーが含まれている場合、ファイルをバイナリと見なします。 これは例で見ることができます。  \ x80をUTF-8Unicodeポイントの最初のバイトにすることはできないため、UTF-8エンコードエラーのあるファイルを作成しましょう。

$ printf 'Encoding\x80' >> encoding.txt

一致する単語「Encoding」に対してgrepを使用すると、次のようになります。

$ grep "Encoding" encoding.txt
Binary file encoding.txt matches

grep は、ファイル encoding.txt が、エンコードエラーのあるテキストファイルのみである場合、バイナリファイルとして解釈することがわかります。

2.2. NULバイト

grep ツールは、NULバイトを読み取ろうとしてバッファーをスキャンしますが、ファイルの残りのデータにNULが必要であると判断できるかどうかも確認します。 ホールは未書き込みのデータであり、UnixはNULバイトとして読み取ることを義務付けているため、ファイルにホールが含まれている場合、そのファイルにはNULが含まれ、grepはファイルをバイナリと見なします。 テキストファイルにNULバイトが含まれている非常に簡単な例を見てみましょう。

$ printf "File with NUL byte\0" >> nul.txt

このファイルでgrepコマンドを使用してみましょう。

$ grep "NUL" nul.txt
Binary file nul.txt matches

この場合も、 grep は、これがNULバイトのプレーンテキストファイルではなく、バイナリファイルであると見なしていることがわかります。

3. バイナリファイルを使用したgrepコマンド

特定の文字列値を含むすべてのファイルを検索しようとすると、チェックしたくないバイナリファイルをチェックするのに非常にコストがかかる可能性があります。 場合によっては、バイナリファイルが非常に大きくなる可能性があり、それらをスキャンする時間とリソースを浪費することになります。 バイナリファイルの内部を見たくない例を見てみましょう。

3.1. バイナリファイルを抑制せずにgrepを使用する

すべてのファイルから「printHello」というテキストを検索するとします。 この単語は、定義されたC関数「voidprintHello」に対応し、プロジェクトで複数回使用されていますが、どこでどのように使用するかを知りたいと思います。 これで、テキストファイル( hello.c )を生成できます。

$ cat <<EOF >>hello.c
#include <stdio.h>
#include <stdlib.h>
void printHello(){printf ("Hello World\n");}
int main() {
    printHello();
    return 0;
}
EOF

hello.c をコンパイルして、バイナリファイル( out.x )を生成しましょう。

$ gcc hello.c -o out.x

ファイルout.xを生成するために、ほとんどのLinuxディストリビューションに存在するCコンパイラであるGCCを使用しています。ファイル:

$ grep "printHello"
hello.c:void printHello(){printf ("Hello World\n");}
hello.c:printHello();
Binary file out.x matches

grep の出力は、“ printHello”hello.cファイルで見つかったことを示しています。 ただし、バイナリファイルにも含まれています。

3.2. grepの使用バイナリファイルの抑制

コードを含むテキストファイルのみを表示したいので、grepを使用してバイナリファイルをスキップしましょう。

$ grep -I "printHello" *
hello.c:void printHello(){printf ("Hello World\n");} 
hello.c:printHello();

ここでは、 -私パラメータと私たちも使用することができます -binary-files=without-match。 これらは grep バイナリファイルをスキップするオプション。 これはまさに私たちが探していたものです。 これで、テキストファイルからのすべての一致が得られましたが、バイナリファイルからの一致はありません。

4. 結論

この記事では、grepツールがバイナリファイルをどのように理解するかを見ました。 また、 grep によって、非バイナリファイルがバイナリとして解釈される場合もあります。

最後に、バイナリファイルを抑制しながらテキストファイルをスキャンするのに役立つ簡単なコマンドを学びました。