バイナリファイルを除外しながらgrepを使用する
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();
ここでは、 -私パラメータと私たちも使用することができます
4. 結論
この記事では、grepツールがバイナリファイルをどのように理解するかを見ました。 また、 grep によって、非バイナリファイルがバイナリとして解釈される場合もあります。
最後に、バイナリファイルを抑制しながらテキストファイルをスキャンするのに役立つ簡単なコマンドを学びました。