/ procとrawディスクで「grep」を使用するのが悪い考えの正確な理由は何ですか?


9

私はgrep -r "searchphrase" /今日走りました、そしてそれはうまくいきませんでした。私はいくつかの研究を行いfind / -xdev -type f -print0 | xargs -0 grep -H "searchphrase"、正しいアプローチであることがわかりました。

私は収集し/proc、ディスク/dev/sda1は失敗したgrepの犯人です。

「なぜ」に関する深い技術的背景が欲しいです。内のいくつかのリンク/procがトラバースされると無限ループを作成すると思います、そして私はもっと多くの理由がありますが特定は何もないと読んだと思います。

また、rawディスクがgrepさ​​れた場合はどうなりますか?バイナリデータ(/dev/sda1私が知る限り、でアクセス可能ですか?)は解釈できません。mountファイルシステムタイプを持つだけがディスクからのデータをわかりやすくするためですか?したがって、バイナリ文字列をgrepすることはまだ可能ですか?

回答:


11

はい、できますがgrep /dev/sda1/procたぶんしたくないでしょう。さらに詳細に:

  1. はい、grepのバイナリコンテンツを実行できます/dev/sda1。しかし、最近の大容量のハードディスクでは、これには非常に長い時間がかかり、結果は役に立たない可能性があります。

  2. はい、内容をgrepできますが/proc、コンピュータのメモリがファイルとしてマップされていることに注意してください。ギガバイトのRAMを備えた最新のコンピューターでは、grepに長い時間がかかり、繰り返しになりますが、結果は役に立ちそうにありません。

例外として、ファイルシステムが破損しているハードディスク上のデータを探している場合grep something /dev/sda1、ファイルのデータを回復する試みの一部として実行される可能性があります。

の他の問題のあるファイル /dev

ハードディスクとハードディスクパーティション/devは、十分な忍耐力があれば、ぎこちないことがあります。ただし、他のファイル(ヒント:user2313067)は問題を引き起こす可能性があります。

  1. /dev/zero無限の長さのファイルです。幸い、grep(少なくともGNUバージョン)はそれをスキップするのに十分スマートです。

    $ grep something /dev/zero
    grep: input is too large to count
    
  2. /dev/randomそして/dev/urandomまた無限です。停止grep something /dev/randomするように指示されない限り、コマンドは永久に実行されますgrep

    /dev/urandomパスワードを生成するときにgrepを使用すると便利です。たとえば、ランダムな5文字の英数字を取得するには:

    $ grep --text -o '[[:alnum:]]' /dev/urandom | head -c 10
    G
    4
    n
    X
    2
    

    十分な数の文字を受け取った後head、パイプを閉じてgrepを終了させるため、これは無限ではありません。

無限ループ

"...リンク...トラバースしたときに無限ループを作成..."

Grep(少なくともGNUバージョン)は、それを行わないほど賢いです。次の2つのケースを考えてみましょう。

  1. この-rオプションを使用すると、コマンドラインで明示的に指定されない限り、grep シンボリックリンクをたどりません。したがって、無限ループは不可能です。

  2. では-Rオプション、grepのないシンボリックリンクをたどりますが、それらをチェックし、ループに巻き込まれることを拒否。説明する:

    $ mkdir a
    $ ln -s ../ a/b
    $ grep -R something .
    grep: warning: ./a/b: recursive directory loop
    

から問題のあるディレクトリを除外する grep -r

余談ですが、grepgrepが特定のファイルまたはディレクトリを検索しないようにするための限定的な機能を提供します。たとえば、という名前のすべてのディレクトリを除外することができprocsysと、devとはgrepの再帰検索から:

grep --exclude-dir proc --exclude-dir sys --exclude-dir dev -r something /

また、我々は除外することができprocsysおよびdevbashのの拡張グロブを使用して:

shopt -s extglob
grep -r something /!(proc|sys|dev)

ありがとう!それは素晴らしい答えです。今夜、暗闇から別のヒーローが現れない限り、私はそれを明日受け入れます!私はもう1つ疑問に思っています。それが遠くないことを願ってgrepいます。/procマップされたメモリにつながるファイルを検索するとgrep、(ランダムな)メモリ内のEOFにヒットし、次のデータが検索する新しいファイル名?私はgrepソースコードを読み始めましたが、私はそれをあまり見ないでしょう。
curious_weather 2016年

1
@krork CP / Mなどの一部の古いオペレーティングシステムでは、ファイルの終わりはEOF文字によって通知されました。最近のファイルシステムはファイルのサイズを追跡しているため、このような文字は使用されなくなりました。
John1024

2
/devgrepがスキャン/dev/zeroなどを開始すると、Grep が終了しない場合があります。/procまたはにそのようなファイルが存在するかどうか不明です/sys
user2313067

1
@ user2313067いい点!GNU grepは検索を拒否しますが/dev/zero/dev/random停止しない限り永久に検索します。回答を更新しました。
John1024

私は/ procや/ sysをあまり使っていませんが、これらはいつでも更新される可能性がある仮想ディレクトリであるため、複数回実行すると予期しない/繰り返せない結果になる可能性があります。もちろん、これは通常のファイルシステムでも発生する可能性がありますが、ここでは少し驚くかもしれません。
Joe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.