サブディレクトリのテキスト検索

管理者の作業中に質問が発生し、その解決策は重要でないように見えるために定期的に延期されますが、時には予期せずに答えを見つけます。 私はそのような質問の1つを簡単な答えと共有することを急いでいます(windowsファイル、解決策はlinuxなので、バイアスはlinuxに向かっています)。



問題は、サブディレクトリ内のすべてのテキストファイルを調べ、テキスト文字列の値を正規表現で表示することでした。 (ここではエクスプローラーやウィンドウコマンダーが役に立たないことは明らかです)。



状況:

テキストファイルに多くのログ。 ログの値は、主にJSON形式のFireFox、FlashPlayer、officeなどのレジストリハイブです。 スクリプトはJavaScript + WMIで記述され、コンピューターとユーザーの起動時にActive Directoryに配置されました。 主な関心事であったレジストリキーを次に示します。



HKLM \ソフトウェア\ Macromedia \ FlashPlayer

HKLM \ソフトウェア\ Macromedia \ FlashPlayerActiveX

HKLM \ソフトウェア\ Macromedia \ FlashPlayerPlugin

HKLM \ソフトウェア\ Microsoft \ Windows \ CurrentVersion \アンインストール

HKLM \ソフトウェア\ Mozilla.org

HKLM \ソフトウェア\ Mozilla

HKLM \ソフトウェア\ MozillaPlugins





ログは、次の形式でテキストファイルに作成されました\\ serverlog \ logs $ \ [日付] \ [コンピューター名] \ [禁止された特殊文字のないレジストリハイブへのパス] .txt このようなファイルの名前の例は、「 \\ serverlegs \ logs $ \ regToFile.ANSI \ 2011-09-13 \ regToFile- [12-143057] [2011-09-03] \ [HKCU] [SOFTWARE] [Macromedia] [FlashPlayer]です。 txt "。 その内容の例:



 [
  {「パス」:「HKLM \\ソフトウェア\\ Macromedia \\ FlashPlayer」、「type」:「folder」}、
  {"パス": "HKLM \\ソフトウェア\\ Macromedia \\ FlashPlayer"、 "type": "REG_SZ"、 "name": "CurrentVersion"、 "value": "9,0,45,0"}、
  {「パス」:「HKLM \\ソフトウェア\\ Macromedia \\ FlashPlayer \\ SafeVersions」、「type」:「folder」}、
  {「パス」:「HKLM \\ソフトウェア\\ Macromedia \\ FlashPlayer \\ SafeVersions」、「type」:「REG_DWORD」、「name」:「6.0」、「value」:88}、
  {「パス」:「HKLM \\ソフトウェア\\ Macromedia \\ FlashPlayer \\ SafeVersions」、「type」:「REG_DWORD」、「name」:「7.0」、「value」:65}、
  {「パス」:「HKLM \\ソフトウェア\\ Macromedia \\ FlashPlayer \\ SafeVersions」、「type」:「REG_DWORD」、「name」:「8.0」、「value」:33}、
  {「パス」:「HKLM \\ソフトウェア\\ Macromedia \\ FlashPlayer \\ SafeVersions」、「type」:「REG_DWORD」、「name」:「9.0」、「value」:45}
 ]




ドメインには100台以上のマシンがあり、ファイルの数は急速に増加しています。 そのようなログのセットがあるので、私は時々、ファイルの内容の写真を次のような形でその場で作成したいことがあります。







しかし、ログファイルがサブディレクトリに散在している場合、それらに対して(windows)findコマンドを実行することはできません。サブディレクトリで検索することはできません。 Ubuntuのログでネットワークディレクトリをマウントします( sudo mount -t cifs -o user = <domain \\ username>、password = <domain_password>、iocharset = utf8 // serverlogs / logs $ / / media / serverlogs / )。 最初はLinuxでの試行に失敗しました。 findコマンドにも同じ問題があります! しかし、インターフェースはまったく使いやすいものではありませんが、Linuxはコンソールが管理指向であるため優れています。 人には、findコマンドには-execオプションがあると書かれています。 これは単なるスーパーオプションです。 残っているのは、このキーのgrepコマンドを置き換えることだけであり、大事な結果が得られます...しかし、ここで少し失望を待っています! ログファイルはUNICODEで書き込まれた(おそらく私のアーキテクチャ上の間違い?)、そしてgrep point blankはUNICODEを理解しません(しかしUTF-8は理解します)。 さらに考えを発展させます。エンコードをオンザフライで変換できるiconvコマンドがあります。 これは彼女の機会が重宝した場所です。 さらに、「パイプライン」を使用して、この種のコマンドを取得します。



time find /media/serverlogs/regToFile.ANSI/ -name "*.txt" -exec iconv -f UNICODE -t UTF-8 {} \; | grep 'Macromedia\\\\FlashPlayer.*CurrentVersion'







少し説明:

[ time ]- コマンドにかかった時間を表示します

[ find /media/server03-logs/regToFile.ANSI/ -name "* .txt" ]- サブディレクトリ[/media/serverlogs/regToFile.ANSI/]にある* .txtタイプのすべてのファイルを表示する

[ -exec iconv -f UNICODE -t UTF-8 {} \; ]- 見つかったファイルの内容を(一度に1つずつ)UNICODEエンコーディングからUTF-8に変換します

[ | grep 'Macromedia \\\\ FlashPlayer。* CurrentVersion' ]- 文字列Macromedia \\\\ FlashPlayerを検索します。*変換されたテキストでCurrentVersion



望ましい結果が達成され、上の図のようになります。 このような問題を抱えたのは私だけではないと思います。 誰かが重宝してくれたら嬉しいです。



PS

コメントを分析した後、man grep -rと "System.FileSystemObject"のヘルプ.OpenAsTextStream()は、このOpenAsTextStream()メソッドで問題が元々「隠されていた」と結論付けました。 formatパラメーターがあります。 -1の場合、ファイルはUNICODEモードで開かれ、0の場合、ASCIIモードで開かれます(ただし、ANSIではなく、utf-8です)。 -1でした。 それが問題の根本でした。 0に設定し、grep -r(Linuxの場合)およびWindowsのfindstrが機能し始めました。 もちろん、UNICODEを理解していないのは奇妙です。 さて、画面に表示する前に見つかった文字列で何かをしたい場合は、find -execを使用します。



見つかった行を表示するには:



JavaScript-> "System.FileSystemObject" .OpenAsTextStream(ForAppending、TristateFalse); (UTF-8のTristateFalse !!!!)

Windows:

cd <rootPath>

findstr / s "text" * .txt



Linux:

grep -r "text" <rootPath>



検索トピックを続けて、UNICODE形式のログを含むファイルをUTF-8形式に変換しました(Linux / bashコンソールで):



time find /media/serverlogs/ -name "*.txt" -exec iconv -f=UNICODE -t=UTF-8 {} -o {}.utf8 \; -exec echo {} \;







-execスイッチを2回使用して、変換されたファイルの名前をコンソールに表示する必要があることに注意してください。 1つのキー-&execで&&メソッドを使用してコマンドを結合すると失敗します。 -execスイッチは、1つのコマンドのみを受け入れます。



All Articles